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 LAX77FUA15Accident · No injuriesClosedWilga 104 · Anaheim, CANTSB FTW77DPJ18Accident · No injuriesClosedBlanik L-13 · Guymon, OKNTSB CHI77FEX24Accident · Minor injuriesClosedCessna 150H · Sheridan, INNTSB FTW77DRG44Accident · No injuriesClosedAstir 1 · Spicewood, TXNTSB DEN77FQA33Accident · No injuriesClosedPiper PA-34 · Gallup, NMNTSB ANC77DAG55Accident · Serious injuriesClosedPiper PA-18 · Kenai, AKNTSB IAD77DLJ14Accident · No injuriesClosedCessna 150 · Knightdale, NCNTSB LAX77DUJ47Accident · No injuriesClosedSchweizer SGS233 · Phoenix, AZNTSB DEN77DTE38Accident · Serious injuriesClosedSchweizer 2-33A · Wellington, CONTSB NYC77FA055Accident · 2 fatalClosedGR Lakes 2T1A-2 · Milford, NJNTSB SEA77FA030Accident · 1 fatalClosedBeech 58 · Vancouver, WANTSB CHI77FA042Accident · 1 fatalClosedBeagle 206S2 · Mendon, MINTSB NYC77FHJ18Accident · Serious injuriesClosedPiper PA-28 · Flushing, NYNTSB NYC77DNC28Accident · Minor injuriesClosedPiper PA-22 · Montville, MENTSB IAD77FLQ12Accident · 1 fatalClosedBeech F35 · Pikeville, KYNTSB DEN77FTE36Accident · Serious injuriesClosedCessna 182F · Walden, CONTSB CHI77FEI20Accident · Minor injuriesClosedBrantly B-2 · Orrville, OHNTSB DEN77FA037Accident · 2 fatalClosedPiper PA-32 · Englewood, CONTSB MIA77DLA27Accident · Minor injuriesClosedMolino PIK-20 · Lake City, FLNTSB SEA77DYA17Accident · No injuriesClosedPorterfield LP65 · American Falls, IDNTSB LAX77FUQ28Accident · No injuriesClosedCessna 172M · Simi Valley, CANTSB CHI77FEI19Accident · No injuriesClosedCessna 172 · Ashtabula, OHNTSB ANC77DAA22Accident · No injuriesClosedBellanca 7GCBC · Venetie, AKNTSB SEA77DYP28Accident · Serious injuriesClosedAeronca 7AC · Athol, IDNTSB OAK77FVA29Accident · No injuriesClosedCessna A150K · Fresno, CANTSB MKC77DCG19Accident · No injuriesClosedPiper PA-28 · Ft Leavenworth, KSNTSB FTW77DPD21Accident · No injuriesClosedCessna 150 · Abilene, TXNTSB SEA77FTA16Accident · No injuriesClosedPiper J3 · Otter, MTNTSB NYC77DNC26Accident · Minor injuriesClosedCessna 150M · Richmond Is, MENTSB MKC77FA021Accident · 1 fatalClosedCessna 182M · Aberdeen, SDNTSB SEA77FYM29Accident · Minor injuriesClosedCessna 140 · Vancouver, WANTSB MKC77FCQ30Accident · Minor injuriesClosedCessna 172M · Iola, KSNTSB NYC77FHJ15Accident · No injuriesClosedCessna 210K · Ronkonkoma, NYNTSB MKC77FA020Accident · No injuriesClosedCessna 320C · Osborne, KSNTSB MIA77FKJ34Accident · No injuriesClosedHughes 269C · Clanton, ALNTSB IAD77FA036Accident · 4 fatalClosedPiper PA-28 · Windsor, NCNTSB MKC77DER36Accident · No injuriesClosedCessna 172 · Erskine, MNNTSB FTW77FA049Accident · 5 fatalClosedBeech BE200 · Ruddock, LANTSB IAD77FLQ10Accident · Minor injuriesClosedCessna 172 · Louisville, KYNTSB OAK77DVG25Accident · No injuriesClosedSchweizer SGS126 · Vacaville, CANTSB MIA77FLA26Accident · 1 fatalClosedBensen BM-8 · Palatka, FLNTSB MKC77FCA16Accident · Serious injuriesClosedTeenie Spcl · Houston, MONTSB LAX77FUA09Accident · No injuriesClosedBeech H35 · Fullerton, CANTSB SEA77DYM28Accident · Minor injuriesClosedAeronca 7AC · Vancouver, WANTSB NYC77FNE15Accident · No injuriesClosedCessna 150 · Turner Falls, MANTSB MIA77FA052Accident · 4 fatalClosedBeech A36 · Miami, FLNTSB CHI77FEM22Accident · 1 fatalClosedAmer Avco AA1 · East Tawas, MINTSB FTW77FQD15Accident · No injuriesClosedCessna T310Q · El Paso, TXNTSB CHI77FEI17Accident · Serious injuriesClosedCessna 172I · Willoughby, OHNTSB NYC77FA050Accident · Serious injuriesClosedConvair 240 · Hyannis, MA