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 MIA80FKJ07Accident · No injuriesClosedCessna 210 · Birmingham, ALNTSB LAX80AA008Accident · 10 fatalClosedBeech 200 · San Ysidro, CANTSB DEN80FA006Accident · 4 fatalClosedCessna C210T · Jackson, WYNTSB DEN80FTE04Accident · No injuriesClosedPiper PA-23 · Peyton, CONTSB MIA80FA006Accident · 1 fatalClosedSikorsky S-55 · Davenport, FLNTSB NYC80FGM03Accident · Minor injuriesClosedBeech A23 · Bradford, PANTSB CHI80DEG02Accident · No injuriesClosedBellanca 7ECA · Dayton, OHNTSB MIA80DLG02Accident · No injuriesClosedCessna 150 · Moncks Corner, SCNTSB LAX80FV602Accident · No injuriesClosedCessna 172 · Fair Oaks, CANTSB MKC80FTK02Accident · No injuriesClosedVarieze Ratan · Aberdeen, SDNTSB FTW80DRJ04Accident · No injuriesClosedAeronca 7AC · Kilgore, TXNTSB MKC80FER04Accident · No injuriesClosedCessna 177 · Wheaton, MNNTSB MIA80DLG01Accident · Minor injuriesClosedQuickie 1 · Allendale, SCNTSB FTW80FRA03Accident · No injuriesClosedGrum Amer AA-5A · Houston, TXNTSB CHI80FEP04Accident · Minor injuriesClosedCessna 152 · Lake Geneva, WINTSB SEA80DYA02Accident · No injuriesClosedAmer Avco AA1-C · Rexburg, IDNTSB DEN80DTE03Accident · No injuriesClosedPiper PA-28 · Byers, CONTSB CHI80FA005Accident · 1 fatalClosedCessna 150 · Albany, OHNTSB LAX80FUD01Accident · No injuriesClosedCessna 501 · Hawthorn, CANTSB DEN80FTE02Accident · Minor injuriesClosedPiper PA-18 · Evergreen, CONTSB NYC80FFA03Accident · No injuriesClosedCessna 150M · Albany, NYNTSB MIA80DKJ05Accident · Serious injuriesClosedCessna 172 · Alexander City, ALNTSB CHI80FEI02Accident · Minor injuriesClosedWalton JD1 · Salem, OHNTSB MIA80FKG03Accident · No injuriesClosedCessna 152 · Snellville, GANTSB MKC80FCQ02Accident · No injuriesClosedAiryplane PDQ · Lyons, KSNTSB DEN79FQA04Accident · No injuriesClosedPiper PA-12 · Farmington, NMNTSB IAD80FA005Accident · 1 fatalClosedRockwell 114 · Bethany, WVNTSB MKC79DCJ01Accident · Minor injuriesClosedCessna 150 · O'Neill, NENTSB LAX80FA002Accident · No injuriesClosedCessna P210N · San Jose, CANTSB CHI79FEM01Accident · 1 fatalClosedCessna 177 · Baraga, MINTSB NYC80DNC06Accident · No injuriesClosed0berlerchne MG23SL · Roxbury, VTNTSB MIA80DKT02Accident · Serious injuriesClosedCessna 150 · South Bay, FLNTSB CHI80DEV01Accident · Serious injuriesClosedSchweizer SGU222 · Moweaqua, ILNTSB MIA80FKG02Accident · Serious injuriesClosedAdams,Md AX-6 · Helen, GANTSB LAX80FUQ01Accident · Minor injuriesClosedCessna 152 · Ojai, CANTSB FTW80IA003Incident · No injuriesClosedDehailland DHC6 · Houston, TXNTSB ANC80FAA01Accident · No injuriesClosedTaylorcraft BC12-D · Fairbanks, AKNTSB NYC80FA002Accident · 2 fatalClosedCessna 310R · Bethlehem, CTNTSB FTW80FRD01Accident · No injuriesClosedPiper PA-23 · Opelousas, LANTSB CHI80FEK01Accident · No injuriesClosedAero Comdr 690 · Columbus, OHNTSB SEA79FTI27Accident · Serious injuriesClosedCessna 182C · Whitefish, MTNTSB MKC79DCG81Accident · No injuriesClosedPiper PA-32 · Green City, MONTSB MKC79DCD43Accident · No injuriesClosedPiper PA-28 · Wever, IANTSB LAX79FVG80Accident · Serious injuriesClosedPiper PA-23 · Redding, CANTSB IAD79FA095Accident · No injuriesClosedPiper PA-31 · Lynchburg, VANTSB IAD79FA092Accident · 1 fatalClosedPiper PA-23 · Greensboro, NCNTSB SEA79FYM69Accident · Serious injuriesClosedMoots BD-4 · Battle Ground, WANTSB MKC79DCQ47Accident · No injuriesClosedPiper PA-28 · Goodland, KSNTSB ANC79FAA38Accident · No injuriesClosedAeronca 7AC · Fairbanks, AKNTSB NYC80FFJ28Accident · Serious injuriesClosedCessna 150 · Waterloo, NY