NTSB investigations
20,996 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 SEA70DWD18Accident · Minor injuriesClosedPiper J-3 · Bellingham, WANTSB OAK70DXQ16Accident · No injuriesClosedSchempp STD · Gerlach, NVNTSB NYC70DFJ11Accident · No injuriesClosedBeech 23 · Hammondsport, NYNTSB CHI70FBJ32Accident · Serious injuriesClosedSchreder HP-14 · Portage, MINTSB CHI70DDJ22Accident · No injuriesClosedPiper PA-28R · Washington Is, WINTSB CHI70FBQ20Accident · No injuriesClosedCessna 175 · Manito, ILNTSB FTW70AF080Accident · 4 fatalClosedBeech A65 · Bethany, OKNTSB NYC70FFJ10Accident · Serious injuriesClosedBeech 23 · Richland, NYNTSB CHI70FDJ21Accident · No injuriesClosedPiper PA-22 · Mount Horeb, WINTSB CHI70AC087Accident · 1 fatalClosedCessna 182L · Bloomington, INNTSB ANC70AA093Accident · No injuriesClosedPiper PA-32 · Peterson Pt, AKNTSB ANC70DAG22Accident · Minor injuriesClosedAeronca 7AC · Palmer, AKNTSB NYC70FGM20Accident · No injuriesClosedBeech A23-19 · New Castle, PANTSB MKC70DCG31Accident · No injuriesClosedCessna 206 · Grain Valley, MONTSB MIA70DLG23Accident · Minor injuriesClosedPiper PA-12 · Mt Pleasant, SCNTSB MIA70DKJ39Accident · No injuriesClosedPiper PA-28R · Foley, ALNTSB CHI70FDM03Accident · Minor injuriesClosedChampion 7ECA · Webster, WINTSB CHI70FBJ29Accident · Minor injuriesClosedPiper PA-28 · Grandville, MINTSB MIA70FKG34Accident · No injuriesClosedPiper PA-23 · Douglasville, GANTSB IAD70FGN19Accident · No injuriesClosedBeech 23 · Wierton, WVNTSB CHI70FDW20Accident · No injuriesClosedCessna 180 · Haslett, MINTSB CHI70DGD21Accident · Serious injuriesClosedPiper J3C-65 · Mantua, OHNTSB CAN71AA903Accident · Minor injuriesClosedPiper PA-23 · Gander, CanadaNTSB FTW70FPD14Accident · No injuriesClosedLuscombe 8A · Saginaw, TXNTSB MKC70IK065Incident · No injuriesClosedBoeing 747 · Salina, KSNTSB CHI70FDW18Accident · No injuriesClosedPiper PA-16 · South Rockwd, MINTSB SEA70IS044Incident · No injuriesClosedBoeing 747 · Moses Lake, WANTSB OAK70DVG31Accident · No injuriesClosedGlasflugel BS-1 · Anderson, CANTSB SEA70DVQ08Accident · No injuriesClosedCessna 172 · Creswell, ORNTSB NYC70DFM13Accident · No injuriesClosedCessna 177 · Ansonia, CTNTSB CHI70FBD39Accident · Serious injuriesClosedPiper PA-25 · Saint Anne, ILNTSB SEA70FDG04Accident · Minor injuriesClosedMooney M20D · Great Falls, MTNTSB MIA70DKG33Accident · Minor injuriesClosedChampion 7GCBC · Lafayette, GANTSB LAX70DUJ35Accident · No injuriesClosedMorrissey 2150A · Phoenix, AZNTSB DEN70DQA22Accident · No injuriesClosedPiper PA-28R · Espanola, NMNTSB CHI70FBD35Accident · Serious injuriesClosedCessna 150A · Oswego, ILNTSB CHI70AC081Accident · 4 fatalClosedMeyers 200-C · Hart, MINTSB MIA70DKJ37Accident · No injuriesClosedBensen B-8M · Enterprise, ALNTSB IAD70FI018Accident · Minor injuriesClosedCessna 182K · Richmond, VANTSB CHI70FDW17Accident · No injuriesClosedStinson 108-1 · Hudson, MINTSB MKC70DCD31Accident · Minor injuriesClosedCessna 182M · Atlantic, IANTSB FTW70FPA15Accident · No injuriesClosedCessna 150 · Dallas, TXNTSB OAK70DVG29Accident · No injuriesClosedCessna 182 · Lincoln, CANTSB MIA70DLD24Accident · No injuriesClosedJodel F-11 · Eustis, FLNTSB MKC70FDD13Accident · No injuriesClosedPiper PA-18 · Laporte, MNNTSB CHI70AC080Accident · 1 fatalClosedTaylorcraft BC-12D · Mauston, WINTSB ANC70FAA11Accident · Minor injuriesClosedHiller Acft FH1100 · Anaktuvk Pas, AKNTSB FTW70DRA16Accident · No injuriesClosedCessna 150 · Huntsville, TXNTSB FTW70AF073Accident · 3 fatalClosedBeech H35 · Tyler, TXNTSB OAK70DVG21Accident · No injuriesClosedCessna 210 · Yountville, CA