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 LAX71FUQ30Accident · Serious injuriesClosedCessna 170B · Pacoima, CANTSB IAD71AI017Accident · 4 fatalClosedBeech A23-24 · Ocean City, MDNTSB FTW71DPD23Accident · No injuriesClosedCessna 150 · Crowley, TXNTSB DEN71FXD33Accident · Minor injuriesClosedAeronca 0-58B · Loveland, CONTSB IAD71AI027Accident · No injuriesClosedMooney M20C · Lynchburg, VANTSB CHI71AC025Accident · 1 fatalClosedPiper PA-31A · Fort Wayne, INNTSB MKC71IK021Incident · No injuriesClosedBoeing 747 · Kansas City, MONTSB CHI71DGD27Accident · No injuriesClosedPiper PA-28 · Shelby, OHNTSB NYC71FGM17Accident · Serious injuriesClosedPiper PA-28 · Washington, PANTSB NYC71FFA21Accident · No injuriesClosedPiper PA-22 · Duanesburg, NYNTSB LAX71AL022Accident · No injuriesClosedPiper PA-28 · Gila Bend, AZNTSB MKC71AK019Accident · 1 fatalClosedPiper PA-28R · Sidney, NENTSB MIA71DLD25Accident · No injuriesClosedCessna 182K · Lutz, FLNTSB LAX71DUJ37Accident · Minor injuriesClosedBeech 36 · Tucson, AZNTSB MKC71AK018Accident · No injuriesClosedCessna 150E · Anoka, MNNTSB MIA71FKQ16Accident · No injuriesClosedBellanca 17-31 · Brandon, MSNTSB IAD71FID10Accident · Serious injuriesClosedBeech A23-19 · Norfolk, VANTSB SEA71FWA22Accident · No injuriesClosedCessna 180H · Battle Grnd, WANTSB MIA71FKJ25Accident · No injuriesClosedCessna 182B · Elberta, ALNTSB NYC71AN047Accident · 3 fatalClosedLockheed Ga 382B · Wrightstown, NJNTSB OAK71FVW13Accident · No injuriesClosedPiper PA-28 · Lida Junction, NVNTSB MIA71FKT10Accident · No injuriesClosedPiper PA-23 · Hollywood Bch, FLNTSB MIA71DKG42Accident · No injuriesClosedCessna 172 · Twin City, GANTSB MIA71FLD23Accident · Serious injuriesClosedCessna 177 · Ft.Pierce, FLNTSB FTW71FRA23Accident · Serious injuriesClosedAmer Avco AA-1 · Houston, TXNTSB SEA71FXM13Accident · Serious injuriesClosedCessna 180 · Hailey, IDNTSB CHI71FDJ19Accident · Serious injuriesClosedCessna 150J · Eau Claire, WINTSB OAK71DVM23Accident · No injuriesClosedBeech C35 · Calif Vally, CANTSB NYC71FHJ15Accident · No injuriesClosedHoward DGA15P · East Moriches, NYNTSB NYC71AN043Accident · 2 fatalClosedAero Comdr 500-B · Mahaffey, PANTSB IAD70DLJ15Accident · Serious injuriesClosedCessna 150 · Edenton, NCNTSB OAK71DVA35Accident · Minor injuriesClosedCessna 182 · Selma, CANTSB NYC71FHG07Accident · No injuriesClosedPiper PA-28 · Marietta, PANTSB MKC71DCJ24Accident · No injuriesClosedBeech 95-C55 · Omaha, NENTSB FTW71FPD22Accident · Serious injuriesClosedBeech V35B · Euless, TXNTSB SEA71DWG24Accident · No injuriesClosedPiper PA-28R · Kamiah, IDNTSB SEA71DVQ12Accident · No injuriesClosedCessna 172 · Lakeview, ORNTSB MKC71FCJ23Accident · Minor injuriesClosedCessna 172 · Pleasnt Dale, NENTSB DEN71FQA16Accident · No injuriesClosedStinson 108-2 · Espanola, NMNTSB ANC71DAG31Accident · No injuriesClosedPiper PA-12 · Anchorage, AKNTSB SEA71FWG23Accident · 1 fatalClosedTaylorcraft BC12-D · Lowden, WANTSB OAK71FJA05Accident · No injuriesClosedPiper PA-28 · Waipahu, HINTSB CHI71AC023Accident · 2 fatalClosedCessna 150 · Mackinaw, ILNTSB SEA71FWG22Accident · No injuriesClosedPiper J3C-65 · Coulee Dam, WANTSB SEA71DWD15Accident · No injuriesClosedCessna 172 · Kenmore, WANTSB SEA71DWA19Accident · No injuriesClosedErco 415-C · Wallowa, ORNTSB FTW71DQG38Accident · No injuriesClosedPiper PA-32 · Sonora, TXNTSB CAN71AP907Accident · 4 fatalClosedCessna T337B · Cranbrook, CanadaNTSB OAK71DVG28Accident · No injuriesClosedCessna 150G · Sacramento, CANTSB NYC71DFG07Accident · No injuriesClosedCessna 150G · Rochester, NH