NTSB investigations
20,992 cases where the phase of flight was Approach.
Cases, newest first
Query with SQL
duckdb -csv -c "WITH phase_names(main, name) AS (VALUES (100, 'Prior to flight'), (150, 'Standing'), (200, 'Pushback/towing'), (250, 'Taxi'), (300, 'Takeoff'), (350, 'Initial climb'), (400, 'Enroute'), (450, 'Maneuvering'), (500, 'Approach'), (550, 'Landing'), (600, 'Emergency descent'), (650, 'Uncontrolled descent'), (700, 'Post-impact'), (750, 'After landing'), (800, 'Other'), (990, 'Unknown')),
crosswalk(code, main, name) AS (VALUES (500, 150, 'Standing'), (501, 150, 'Standing - pre-flight'), (502, 150, 'Standing - starting engine(s)'), (503, 150, 'Standing - engine(s) operating'), (504, 150, 'Standing - engine(s) not operating'), (505, 150, 'Standing - idling rotors'), (510, 250, 'Taxi'), (511, 200, 'Taxi - pushback/tow'), (512, 250, 'Taxi - to takeoff'), (513, 250, 'Taxi - from landing'), (514, 250, 'Taxi - aerial'), (520, 300, 'Takeoff'), (521, 300, 'Takeoff - roll/run'), (522, 350, 'Takeoff - initial climb'), (523, 300, 'Takeoff - aborted'), (530, 400, 'Climb'), (531, 400, 'Climb - to cruise'), (540, 400, 'Cruise'), (541, 400, 'Cruise - normal'), (542, 400, 'Maneuvering - holding (IFR)'), (550, 400, 'Descent'), (551, 400, 'Descent - normal'), (552, 600, 'Descent - emergency'), (553, 650, 'Descent - uncontrolled'), (560, 500, 'Approach'), (561, 500, 'Approach - VFR pattern - downwind'), (562, 500, 'Approach - VFR pattern - base turn'), (563, 500, 'Approach - VFR pattern - base leg/base to final'), (564, 500, 'Approach - VFR pattern - final approach'), (565, 500, 'Go-around (VFR)'), (566, 500, 'Approach - IAF to FAF/outer marker (IFR)'), (567, 500, 'Approach - FAF/outer marker to threshold (IFR)'), (568, 500, 'Circling (IFR)'), (569, 500, 'Missed approach (IFR)'), (570, 550, 'Landing'), (571, 550, 'Landing - flare/touchdown'), (572, 550, 'Landing - roll'), (573, 550, 'Landing - aborted'), (574, 550, 'Emergency landing'), (575, 550, 'Emergency landing after takeoff'), (576, 600, 'Emergency descent/landing'), (580, 450, 'Maneuvering'), (581, 450, 'Maneuvering - aerial application'), (582, 450, 'Maneuvering - turn to reverse direction'), (583, 450, 'Maneuvering - turn to landing area (emergency)'), (590, 450, 'Hover'), (591, 450, 'Hover - in ground effect'), (592, 450, 'Hover - out of ground effect'), (600, 800, 'Other'), (610, 990, 'Unknown')),
current_codes AS (
SELECT e.case_mkey, TRY_CAST(e.\"tier1Number\" AS INTEGER) AS code,
row_number() OVER (PARTITION BY e.case_mkey ORDER BY coalesce(e.\"isDefiningEvent\", false) DESC, e.position) AS n
FROM 'https://openairdocs.org/data/latest/ntsb_events.parquet' e
WHERE e.aircrafts_position = 1 AND e.\"tier1Number\" GLOB '[1-9][0-9]*'
AND (e.\"isDefiningEvent\" OR e.case_mkey IN (SELECT \"mKey\" FROM 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' WHERE \"isPre1982\"))
),
phases AS (
SELECT case_mkey, 'current' AS scheme, code, CASE WHEN code >= 990 THEN 990 ELSE code // 50 * 50 END AS main
FROM current_codes WHERE n = 1
UNION ALL
SELECT o.case_mkey, 'older', o.\"phaseOfFlightCode\", w.main
FROM 'https://openairdocs.org/data/latest/ntsb_occurrences.parquet' o JOIN crosswalk w ON w.code = o.\"phaseOfFlightCode\"
WHERE o.aircrafts_position = 1 AND o.\"occurrenceNumber\" = 1 AND o.case_mkey NOT IN (SELECT case_mkey FROM current_codes)
),
case_phases AS (
SELECT p.*, c.\"eventDate\", c.\"highestInjuryLevel\" = 'Fatal' AS fatal, a.aircraft_model_code
FROM phases p JOIN 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' c ON c.\"mKey\" = p.case_mkey
LEFT JOIN 'https://openairdocs.org/data/latest/ntsb_aircrafts.parquet' a ON a.case_mkey = p.case_mkey AND a.position = 1
WHERE c.\"eventDate\" >= DATE '1962-01-01' AND p.main IN (SELECT main FROM phase_names)
)
SELECT c.\"ntsbNumber\", c.\"eventDate\", c.\"eventType\", c.\"eventCity\", c.\"eventStateOrRegion\", a.n_number, a.\"aircraftMake\", a.\"aircraftModel\", c.\"highestInjuryLevel\", c.\"totalFatal\", c.\"completionStatus\", c.report_url
FROM 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' c LEFT JOIN 'https://openairdocs.org/data/latest/ntsb_aircrafts.parquet' a ON a.case_mkey = c.\"mKey\" AND a.position = 1
WHERE c.\"mKey\" IN (SELECT case_mkey FROM case_phases WHERE main = 500)
ORDER BY c.\"eventDate\" DESC, c.\"ntsbNumber\" DESC"Prints the whole list as CSV. It reads the release’s Parquet files over HTTPS, so there’s nothing to download first. Install DuckDB to run it.
WITH phase_names(main, name) AS (VALUES (100, 'Prior to flight'), (150, 'Standing'), (200, 'Pushback/towing'), (250, 'Taxi'), (300, 'Takeoff'), (350, 'Initial climb'), (400, 'Enroute'), (450, 'Maneuvering'), (500, 'Approach'), (550, 'Landing'), (600, 'Emergency descent'), (650, 'Uncontrolled descent'), (700, 'Post-impact'), (750, 'After landing'), (800, 'Other'), (990, 'Unknown')),
crosswalk(code, main, name) AS (VALUES (500, 150, 'Standing'), (501, 150, 'Standing - pre-flight'), (502, 150, 'Standing - starting engine(s)'), (503, 150, 'Standing - engine(s) operating'), (504, 150, 'Standing - engine(s) not operating'), (505, 150, 'Standing - idling rotors'), (510, 250, 'Taxi'), (511, 200, 'Taxi - pushback/tow'), (512, 250, 'Taxi - to takeoff'), (513, 250, 'Taxi - from landing'), (514, 250, 'Taxi - aerial'), (520, 300, 'Takeoff'), (521, 300, 'Takeoff - roll/run'), (522, 350, 'Takeoff - initial climb'), (523, 300, 'Takeoff - aborted'), (530, 400, 'Climb'), (531, 400, 'Climb - to cruise'), (540, 400, 'Cruise'), (541, 400, 'Cruise - normal'), (542, 400, 'Maneuvering - holding (IFR)'), (550, 400, 'Descent'), (551, 400, 'Descent - normal'), (552, 600, 'Descent - emergency'), (553, 650, 'Descent - uncontrolled'), (560, 500, 'Approach'), (561, 500, 'Approach - VFR pattern - downwind'), (562, 500, 'Approach - VFR pattern - base turn'), (563, 500, 'Approach - VFR pattern - base leg/base to final'), (564, 500, 'Approach - VFR pattern - final approach'), (565, 500, 'Go-around (VFR)'), (566, 500, 'Approach - IAF to FAF/outer marker (IFR)'), (567, 500, 'Approach - FAF/outer marker to threshold (IFR)'), (568, 500, 'Circling (IFR)'), (569, 500, 'Missed approach (IFR)'), (570, 550, 'Landing'), (571, 550, 'Landing - flare/touchdown'), (572, 550, 'Landing - roll'), (573, 550, 'Landing - aborted'), (574, 550, 'Emergency landing'), (575, 550, 'Emergency landing after takeoff'), (576, 600, 'Emergency descent/landing'), (580, 450, 'Maneuvering'), (581, 450, 'Maneuvering - aerial application'), (582, 450, 'Maneuvering - turn to reverse direction'), (583, 450, 'Maneuvering - turn to landing area (emergency)'), (590, 450, 'Hover'), (591, 450, 'Hover - in ground effect'), (592, 450, 'Hover - out of ground effect'), (600, 800, 'Other'), (610, 990, 'Unknown')),
current_codes AS (
SELECT e.case_mkey, TRY_CAST(e."tier1Number" AS INTEGER) AS code,
row_number() OVER (PARTITION BY e.case_mkey ORDER BY coalesce(e."isDefiningEvent", false) DESC, e.position) AS n
FROM 'https://openairdocs.org/data/latest/ntsb_events.parquet' e
WHERE e.aircrafts_position = 1 AND e."tier1Number" GLOB '[1-9][0-9]*'
AND (e."isDefiningEvent" OR e.case_mkey IN (SELECT "mKey" FROM 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' WHERE "isPre1982"))
),
phases AS (
SELECT case_mkey, 'current' AS scheme, code, CASE WHEN code >= 990 THEN 990 ELSE code // 50 * 50 END AS main
FROM current_codes WHERE n = 1
UNION ALL
SELECT o.case_mkey, 'older', o."phaseOfFlightCode", w.main
FROM 'https://openairdocs.org/data/latest/ntsb_occurrences.parquet' o JOIN crosswalk w ON w.code = o."phaseOfFlightCode"
WHERE o.aircrafts_position = 1 AND o."occurrenceNumber" = 1 AND o.case_mkey NOT IN (SELECT case_mkey FROM current_codes)
),
case_phases AS (
SELECT p.*, c."eventDate", c."highestInjuryLevel" = 'Fatal' AS fatal, a.aircraft_model_code
FROM phases p JOIN 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' c ON c."mKey" = p.case_mkey
LEFT JOIN 'https://openairdocs.org/data/latest/ntsb_aircrafts.parquet' a ON a.case_mkey = p.case_mkey AND a.position = 1
WHERE c."eventDate" >= DATE '1962-01-01' AND p.main IN (SELECT main FROM phase_names)
)
SELECT c."ntsbNumber", c."eventDate", c."eventType", c."eventCity", c."eventStateOrRegion", a.n_number, a."aircraftMake", a."aircraftModel", c."highestInjuryLevel", c."totalFatal", c."completionStatus", c.report_url
FROM 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' c LEFT JOIN 'https://openairdocs.org/data/latest/ntsb_aircrafts.parquet' a ON a.case_mkey = c."mKey" AND a.position = 1
WHERE c."mKey" IN (SELECT case_mkey FROM case_phases WHERE main = 500)
ORDER BY c."eventDate" DESC, c."ntsbNumber" DESCRun it at the DuckDB prompt, or in any tool that reads Parquet over HTTPS. More ways to query the release are on Use the data.
NTSB FTW76FQD19Accident · No injuriesClosedBeech C35 · El Paso, TXNTSB ANC76DAA27Accident · No injuriesClosedChampion 7GCBC · Fairbanks, AKNTSB ANC76AA076Accident · 1 fatalClosedPiper PA-18A · Alexander, AKNTSB FTW76DPA20Accident · No injuriesClosedCessna 150 · Sherman, TXNTSB FTW76DPA19Accident · Minor injuriesClosedBeech D18S · Mexia, TXNTSB OAK76FXQ35Accident · Minor injuriesClosedCessna 182 · Jackpot, NVNTSB MKC76FCG58Accident · Minor injuriesClosedPiper PA-28 · Leawood, KSNTSB DEN76FTM23Accident · Minor injuriesClosedCessna T210L · Roosevelt, UTNTSB DEN76DQA38Accident · No injuriesClosedCessna 182H · Kenna, NMNTSB DEN76AD041Accident · No injuriesClosedBell 206B · Gobernador, NMNTSB MKC76DCD32Accident · No injuriesClosedBeech H35 · Des Moines, IANTSB MKC76DCG57Accident · No injuriesClosedCessna 150L · Lawrence, KSNTSB NYC76DNC36Accident · No injuriesClosedCessna 180 · Warren, VTNTSB MIA76FLD49Accident · No injuriesClosedPiper PA-28 · Sebastian, FLNTSB NYC76FHA21Accident · Serious injuriesClosedPiper PA-28 · Pittstown, NJNTSB NYC76DFJ17Accident · Minor injuriesClosedSchweizer SGS233 · Elmira, NYNTSB FTW76FPD33Accident · No injuriesClosedLuscombe 8C · Keene, TXNTSB IAD76AI062Accident · 1 fatalClosedCessna 172L · Accident, MDNTSB CHI76FEA28Accident · Minor injuriesClosedAeronca 7FC · Lebanon, INNTSB MKC76FER56Accident · Serious injuriesClosedCessna 150J · Rochester, MNNTSB CHI76AC054Accident · 1 fatalClosedCessna 310Q · Mattoon, ILNTSB FTW76DRJ17Accident · No injuriesClosedPiper PA-31 · Many, LANTSB MIA76FLD48Accident · No injuriesClosedSchweizer SGS233 · Oviedo, FLNTSB LAX76FUM21Accident · 1 fatalClosedBensen B8M · Holtville, CANTSB CHI76FEV28Accident · No injuriesClosedPiper PA-32 · Springfield, ILNTSB MIA76AM071Accident · 2 fatalClosedGrum Amer AA-5 · Lake Placid, FLNTSB NYC76AN085Accident · 1 fatalClosedAero Comdr 560E · Reading, PANTSB FTW76FQD16Accident · Serious injuriesClosedCessna 210K · El Paso, TXNTSB FTW76AF068Accident · 1 fatalClosedPiper PA-22 · Liberty, TXNTSB SEA76DYE27Accident · No injuriesClosedAeronca 11AC · Waldron Island, WANTSB MKC76FER54Accident · Serious injuriesClosedNavion H · Bloomington, MNNTSB CHI76AC052Accident · 1 fatalClosedBeech E18S · Burlington, WINTSB MIA76OKT55Accident · No injuriesClosedTaylorcraft BL-65 · Abaco, Burkina FasoNTSB LAX76DUG44Accident · No injuriesClosedSchweizer SGS233 · Adelanto, CANTSB DEN76FTE55Accident · No injuriesClosedPiper PA-18 · Durango, CONTSB DEN76DTC26Accident · Minor injuriesClosedCessna T210L · Afton, WYNTSB DEN76FQD15Accident · Serious injuriesClosedCessna 120 · Alamogordo, NMNTSB CHI76FEI21Accident · Minor injuriesClosedCessna T210L · Lorain, OHNTSB CHI76FEC29Accident · No injuriesClosedBellanca 17-30 · Port Huron, MINTSB MIA76DKA03Accident · Minor injuriesClosedCessna 185 · St Thomas, VINTSB DEN76DTC25Accident · No injuriesClosedCessna 150L · Jackson, WYNTSB MKC76FCG52Accident · No injuriesClosedPiper PA-28 · Greenfield, MONTSB DEN76FTM18Accident · No injuriesClosedCessna 210A · Salt Lake City, UTNTSB SEA76FYC33Accident · No injuriesClosedPiper PA-22 · Hillsboro, ORNTSB MIA76AM065Accident · No injuriesClosedCessna 172 · Ormond Beach, FLNTSB IAD76DLQ14Accident · No injuriesClosedMine-Copter R100 · Pikeville, KYNTSB MKC76AK044Accident · Serious injuriesClosedCessna 182P · Rolla, NDNTSB MIA76AM064Accident · 1 fatalClosedPiper PA-24 · Punta Gorda, FLNTSB MIA76AM063Accident · 2 fatalClosedPine Air Super · Iuka, MSNTSB NYC76AN080Accident · 1 fatalClosedMitsubishi MU2B20 · Argyle, NY