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 MIA77DLD27Accident · No injuriesClosedMaule M5 · Venice, FLNTSB FTW77FA033Accident · 2 fatalClosedSwearingen SA266T · Beckmam, TXNTSB IAD77FLQ06Accident · No injuriesClosedPiper PA-23 · Louisville, KYNTSB ANC77FAD03Accident · Minor injuriesClosedCessna 180G · Annette Island, AKNTSB LAX77FUG27Accident · No injuriesClosedPiper PA-28 · Riverside, CANTSB CHI77DEP15Accident · No injuriesClosedPiper PA-28 · Pewaukee, WINTSB IAD77FA018Accident · 2 fatalClosedCessna 177RG · Chattanooga, TNNTSB FTW77FPA13Accident · Minor injuriesClosedCessna 182H · Corsicana, TXNTSB SEA77FA015Accident · 1 fatalClosedPiper PA-32R · Olympia, WANTSB OAK77DVM06Accident · No injuriesClosedRockwell 112A · San Jose, CANTSB MKC77DER16Accident · No injuriesClosedBeechcraft 95-C55 · Marshall, MNNTSB MIA77FA027Accident · No injuriesClosedCessna 172 · Lantana, FLNTSB LAX77FUG26Accident · Minor injuriesClosedLuscombe 8E · Daggett, CANTSB FTW77FPD10Accident · Minor injuriesClosedCessna 172 · Denton, TXNTSB MIA77FLG09Accident · No injuriesClosedCessna 210T · Charleston, SCNTSB MIA77FA026Accident · 2 fatalClosedCessna 411 · Ft Myers, FLNTSB FTW77FPD09Accident · Minor injuriesClosedPiper PA-28R · Denton, TXNTSB DEN77FTE18Accident · Minor injuriesClosedBell 47G3B1 · Cimmaron, CONTSB CHI77FA025Accident · 2 fatalClosedPiper PA-22 · Romeoville, ILNTSB ANC77DAG30Accident · No injuriesClosedCessna 206 · False Pass, AKNTSB SEA77DYM17Accident · No injuriesClosedBeech 60 · Independence, ORNTSB OAK77DVG18Accident · Serious injuriesClosedCessna 172 · Dunsmuir, CANTSB MIA77FLT01Accident · Serious injuriesClosedDehavilland OHC-1 · Walls, MSNTSB MIA77FKQ06Accident · Minor injuriesClosedAeronca 7AC · Madison, MSNTSB OAK77FVD10Accident · Minor injuriesClosedSchweizer 2-33 · Fremont, CANTSB MKC77DCQ14Accident · No injuriesClosedAeronca 11AC · Tetmore, KSNTSB CHI77FEP14Accident · Minor injuriesClosedPiper PA-23 · Lone Rock, WINTSB SEA77FYP17Accident · Minor injuriesClosedAeronca 11AC · Harrah, WANTSB DEN77FTE16Accident · Serious injuriesClosedCessna 150M · Fort Collins, CONTSB OAK77FA013Accident · 2 fatalClosedBeech C45H · Sonoma, CANTSB MIA77FLD25Accident · Minor injuriesClosedPiper PA-28 · Vero Beach, FLNTSB MIA77FKG15Accident · Minor injuriesClosedAero Comdr 100 · Newman, GANTSB NYC77FNC17Accident · Serious injuriesClosedCessna 172 · Caribu, MENTSB IAD77FKW12Accident · No injuriesClosedPiper PA28 · Crossville, TNNTSB LAX77FA023Accident · 1 fatalClosedCessna 140 · Riverside, CANTSB FTW77FA029Accident · 4 fatalClosedBeech 95-B55 · Pampa, TXNTSB FTW77FQG08Accident · Serious injuriesClosedCessna 150H · Sonora, TXNTSB FTW77DRG23Accident · No injuriesClosedCessna 150 · Rio Grand City, TXNTSB SEA77DYM14Accident · No injuriesClosedCessna 182 · Waldport, ORNTSB OAK77FA010Accident · 2 fatalClosedPiper PA-28R · Lemoore, CANTSB NYC77FHA11Accident · Minor injuriesClosedPiper PA-24 · Allentown, PANTSB CHI77FA023Accident · 1 fatalClosedBeech K35 · Delaware Twp, INNTSB MIA77FLG06Accident · No injuriesClosedCessna 150M · Isle Of Palms, SCNTSB MIA77DLA14Accident · No injuriesClosedBoeing B75N1 · Trenton, FLNTSB IAD77FKM10Accident · No injuriesClosedPiper PA-28R · Julian, NCNTSB NYC77DNA08Accident · No injuriesClosedPiper PA-28 · Beverly, MANTSB CHI77FA022Accident · 2 fatalClosedLear Jet 23 · Flint, MINTSB LAX77FA020Accident · Serious injuriesClosedSikorsky H34J · Mt.Wilson, AZNTSB MKC77DCQ13Accident · No injuriesClosedMaule M-4 · Coldwater, KSNTSB FTW77FPD07Accident · Minor injuriesClosedCessna 180 · Ballinger, TX