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 MKC79DCD31Accident · No injuriesClosedCessna 180 · Lawton, IANTSB MIA79DLA38Accident · No injuriesClosedCessna 150 · Waycross, GANTSB UNK79X0112Accident · Minor injuriesClosedGrumman AA-5B · Polo, ILNTSB FTW79FPD27Accident · No injuriesClosedPiper PA-30 · Graford, TXNTSB CHI80FA058Accident · 1 fatalClosedBeech 35-33 · Wheeling, ILNTSB MIA79FA102Accident · 1 fatalClosedCessna 210M · Milton, FLNTSB LAX79FA060Accident · 1 fatalClosedPiper PA-32 · Burmuda Dunes, CANTSB FTW79FA094Accident · 2 fatalClosedCessna 172M · Little Rock, ARNTSB DEN79DTC20Accident · No injuriesClosedCessna 180 · Cody, WYNTSB DEN79FTE57Accident · Serious injuriesClosedSchweizer SGS232 · Colorado Spgs, CONTSB MIA79FA101Accident · 2 fatalClosedCessna 182E · Clearwater, FLNTSB NYC79FNA20Accident · Minor injuriesClosedPiper PA-24 · Marshfield, MANTSB LAX79FUJ92Accident · 1 fatalClosedPietenpol Aircam · Mesa, AZNTSB NYC79FGM33Accident · No injuriesClosedPiper PA-22 · Zelienople, PANTSB NYC79FFJ21Accident · Serious injuriesClosedBriegleb BG-12 · Elmira, NYNTSB MKC79FER52Accident · Serious injuriesClosedPiper PA-38 · St.Paul, MNNTSB LAX79FUM21Accident · Minor injuriesClosedPiper PA-28 · Chula Vista, CANTSB DEN79FTE55Accident · Minor injuriesClosedCessna 150 · Sedalia, CONTSB DEN79FA048Accident · 2 fatalClosedLear Jet 25B · Pueblo, CONTSB CHI79FEK17Accident · 1 fatalClosedVariviggen Edgar · Columbus, OHNTSB NYC79FHJ20Accident · No injuriesClosedGrum Amer AA1-C · Shirley, NYNTSB MKC79FA038Accident · 2 fatalClosedAeronca 7AC · Eveleth, MNNTSB IAD79FKM18Accident · No injuriesClosedStinson 108 · Mooresville, NCNTSB CHI79FEP52Accident · Minor injuriesClosedDavis DA-3 · Burlington, WINTSB MIA79DLA35Accident · No injuriesClosedCessna A188 · Pelham, GANTSB SEA79FA041Accident · 2 fatalClosedBellanca 7GCBC · Big Sky, MTNTSB LAX79FUM19Accident · Serious injuriesClosedBeech V35A · San Diego, CANTSB DEN79DQA34Accident · No injuriesClosedCessna 182 · Roswell, NMNTSB CHI79FER03Accident · Minor injuriesClosedCessna 182B · Osceola, WINTSB NYC79FNC33Accident · Minor injuriesClosedGreat Lakes Baby · Farmington, MENTSB NYC79FA051Accident · Minor injuriesClosedBeech C45H · Slatington, PANTSB MIA79DKT78Accident · No injuriesClosedCessna 152 · Opa Locka, FLNTSB LAX79FA058Accident · 2 fatalClosedBeech 35 · Redlands, CANTSB ANC79DAA19Accident · No injuriesClosedPiper PA-18 · Lake Peters, AKNTSB NYC79FHD17Accident · No injuriesClosedCessna 150 · Coatesville, PANTSB FTW79FRD42Accident · No injuriesClosedCessna 172 · Grand Isle, LANTSB CHI79FEC32Accident · No injuriesClosedHughes 269A · Pontiac, MINTSB OAK79DVD32Accident · No injuriesClosedPiper PA-38 · Santa Rosa, CANTSB LAX79FUQ37Accident · No injuriesClosedPiper PA-32 · Burbank, CANTSB SEA79FYM23Accident · Serious injuriesClosedCessna 172M · Vancouver, WANTSB MIA79DKT74Accident · Minor injuriesClosedPiper PA-28 · Miami, FLNTSB IAD79FA058Accident · 3 fatalClosedCessna 421B · Charleston, WVNTSB DEN79FTE48Accident · Minor injuriesClosedCessna T210 · Brighton, CONTSB CHI79DEE63Accident · No injuriesClosedPiper PA-38 · Lansing, ILNTSB ANC79DAA17Accident · Serious injuriesClosedCessna 140 · Tok, AKNTSB OAK79DVD31Accident · No injuriesClosedLet-Np-K L-13 · Livermore, CANTSB LAX79DUG48Accident · Minor injuriesClosedPiper PA-32 · Hesperia, CANTSB FTW79DRD44Accident · No injuriesClosedBell 206B · Bell Rose, LANTSB DCA79AA019Accident · 1 fatalClosedDehavilland DHC-6 · Hyannis, MANTSB CHI79FEE64Accident · No injuriesClosedPiper PA-28 · Chicago, IL