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 CHI70FGG16Accident · No injuriesClosedPiper PA-24 · Columbus, OHNTSB OAK70DVD15Accident · No injuriesClosedBell 47J · Concord, CANTSB CHI70DBD23Accident · No injuriesClosedBeech A23-19 · Waukegan, ILNTSB MIA70DLG14Accident · No injuriesClosedCessna 150 · Moncks Corner, SCNTSB FTW70FRD10Accident · Minor injuriesClosedCessna 150H · Franklinton, LANTSB DEN70DXD21Accident · No injuriesClosedChampion 7KCAB · Pueblo, CONTSB CHI70FGA07Accident · Minor injuriesClosedStarduster TOO · Tremont City, OHNTSB MIA70FKW04Accident · No injuriesClosedStinson 108-1 · Knoxville, TNNTSB CHI70AC069Accident · 4 fatalClosedBeech 36 · Gary, INNTSB OAK70DVG06Accident · No injuriesClosedBeech 95-C55 · Brownsville, CANTSB CHI70AC068Accident · 1 fatalClosedAeronca 7AC · Whitesburg, KYNTSB NYC70AN108Accident · 5 fatalClosedCessna 401A · Morrisville, NCNTSB IAD70AI054Accident · 3 fatalClosedPiper PA-32 · Cambridge, MDNTSB MKC70DDM15Accident · No injuriesClosedCessna 150 · Cambridge, MNNTSB FTW70DRD07Accident · Minor injuriesClosedTaylorcraft BC12-D · Melville, LANTSB CHI70DBJ18Accident · No injuriesClosedAero Comdr 200-D · East Jordan, MINTSB ANC70DAG12Accident · Minor injuriesClosedBeech D-17S · Aniak, AKNTSB LAX70DUJ25Accident · No injuriesClosedSchweizer 1-26B · Chandler, AZNTSB CHI70FBQ09Accident · No injuriesClosedPiper PA-28 · Blooming, ILNTSB CHI70FBJ16Accident · No injuriesClosedCessna 150K · Midland, MINTSB CHI70DDJ14Accident · No injuriesClosedLuscombe 8A · Sheboygan Fls, WINTSB SEA70DDA04Accident · No injuriesClosedCessna 170B · Brusett, MTNTSB CHI70DDJ13Accident · No injuriesClosedLuscombe 8E · Wausau, WINTSB LAX70FUM07Accident · Serious injuriesClosedPiper PA-28 · Julian, CANTSB NYC70AN104Accident · 2 fatalClosedBeech A23A · Montgomeryvlle, PANTSB OAK70DXQ06Accident · Minor injuriesClosedEntwicklung A · Minden, NVNTSB IAD70AI052Accident · 1 fatalClosedPiper J3C-65 · Asheboro, NCNTSB FTW70AF061Accident · 1 fatalClosedCessna 150J · Plano, TXNTSB LAX70AL059Accident · 1 fatalClosedLuscombe 8A · Temecula, CANTSB FTW70FQD07Accident · Minor injuriesClosedCessna 210D · Ft.Stockton, TXNTSB MKC70FDM13Accident · No injuriesClosedBeech 65-A80 · Eden Prairie, MNNTSB LAX70DUJ20Accident · No injuriesClosedSikorsky H-19B · Tucson, AZNTSB NYC70AN102Accident · 4 fatalClosedCessna 402 · Elizabeth, NJNTSB SEA70AS035Accident · 1 fatalClosedBeech 95-B55 · Orofino, IDNTSB MKC70DCJ15Accident · No injuriesClosedCessna 140 · Brule, NENTSB CHI70AC063Accident · 1 fatalClosedBeech 95-B55 · Sharonville, OHNTSB DEN70DQA09Accident · Minor injuriesClosedPiper PA-24 · Taos, NMNTSB MIA70FKT10Accident · 3 fatalClosedPiper PA-28 · Mastic Pt, Burkina FasoNTSB IAD70DIA15Accident · No injuriesClosedMooney M20G · Woodbridge, VANTSB FTW70FPG10Accident · Minor injuriesClosedCessna 120 · Dumas, ARNTSB CHI70FGG13Accident · Minor injuriesClosedCessna 150G · Columbus, OHNTSB IAD70DID15Accident · No injuriesClosedPiper PA-28 · Capeville, VANTSB MIA70DLG10Accident · Minor injuriesClosedCessna 150 · Gaffney, SCNTSB MKC70AK049Accident · 4 fatalClosedPiper PA-28 · Newton, IANTSB IAD70FIG07Accident · No injuriesClosedPiper PA-28 · Laurel, MDNTSB MIA70DLG07Accident · No injuriesClosedPiper PA-28 · Isle Of Palms, SCNTSB IAD70DIA06Accident · Minor injuriesClosedPiper PA-28 · Clinton, MDNTSB NYC70FHM08Accident · No injuriesClosedCessna 150 · Dawling, NYNTSB LAX70DUJ18Accident · No injuriesClosedLuscombe 8A · Huachuca Cy, AZNTSB DEN70FXD09Accident · No injuriesClosedCessna TU206D · Aspen, CO