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 CHI74AC040Accident · 2 fatalClosedNavion B · Columbus, OHNTSB FTW74AF029Accident · 2 fatalClosedCessna 310I · Euless, TXNTSB CHI74FEV26Accident · No injuriesClosedAeronca 7EC · Monticello, ILNTSB NYC74AN040Accident · 3 fatalClosedPiper PA-28 · Farmingdale, NYNTSB MIA74FLT03Accident · Minor injuriesClosedPiper PA-34 · Memphis, TNNTSB NYC74DHD19Accident · No injuriesClosedCessna 150 · Hammonton, NJNTSB FTW74FRA20Accident · Minor injuriesClosedMooney M20A · Huntsville, TXNTSB OAK74FVM13Accident · No injuriesClosedCessna 150 · San Carlos, CANTSB FTW74FPJ12Accident · Serious injuriesClosedBeech 35-33 · Cushing, OKNTSB CHI74FET11Accident · Serious injuriesClosedCessna 150 · Michigan City, INNTSB FTW74FPA09Accident · Minor injuriesClosedPiper PA-28 · Addison, TXNTSB OAK74OJY06Accident · Minor injuriesClosedPilatus PC6CH2 · Lam Son, VMNTSB NYC74FFJ15Accident · No injuriesClosedPiper PA-23 · Rochester, NYNTSB MKC74FCA16Accident · Serious injuriesClosedPiper PA-32 · Rolla, MONTSB OAK74DVA29Accident · Minor injuriesClosedScorpion 1 · Exeter, CANTSB OAK74AP018Accident · 4 fatalClosedBeech 35 · San Jose, CANTSB FTW74FPA08Accident · Minor injuriesClosedPiper PA-25 · Caddo Mills, TXNTSB MKC74DER20Accident · Minor injuriesClosedCessna 175-58 · Lake Elmo, MNNTSB NYC74FHD18Accident · No injuriesClosedPietenpol Aircam · Lakewood, NJNTSB MIA74AM037Accident · No injuriesClosedCurtis-Wrt C-46A · Lakeland, FLNTSB ANC74FAG76Accident · No injuriesClosedCessna 150 · Anchorage, AKNTSB IAD74FID20Accident · No injuriesClosedBeech M35B · Waynesboro, VANTSB FTW74DRG27Accident · No injuriesClosedPiper PA-28R · Weslaco, TXNTSB ANC74DAG69Accident · No injuriesClosedCessna U206 · Bethel, AKNTSB DEN74FTE26Accident · No injuriesClosedBeech C23 · Colo.Springs, CONTSB DEN74DTC19Accident · No injuriesClosedPiper PA-28 · Rock Springs, WYNTSB SEA74DYE22Accident · No injuriesClosedPiper PA-24 · Renton, WANTSB FTW74FPG32Accident · Serious injuriesClosedPiper J3C-65 · Lepanto, ARNTSB SEA74FYA14Accident · Minor injuriesClosedPiper PA-22 · Boise, IDNTSB NYC74FHA13Accident · Minor injuriesClosedCessna 206A · Pittstown, NJNTSB SEA74FTI11Accident · Minor injuriesClosedCessna 182 · Bozeman, MTNTSB MKC74DCD18Accident · No injuriesClosedCessna 172 · Davenport, IANTSB MIA74FKT27Accident · Serious injuriesClosedBeech H18 · Ft Lauderdale, FLNTSB FTW74FPD19Accident · Minor injuriesClosedCessna 150 · Bridgeport, TXNTSB CHI74FEP19Accident · No injuriesClosedCessna 175A · Milwaukee, WINTSB CHI74FEG09Accident · Serious injuriesClosedCessna 150 · Oxford, OHNTSB MIA74DKT26Accident · No injuriesClosedCessna 150K · Opa Locka, FLNTSB NYC74FFA16Accident · No injuriesClosedCessna 172I · Alexandria Bay, NYNTSB CHI74FEM24Accident · No injuriesClosedPiper PA-32 · Lansing, MINTSB NYC74AN033Accident · 3 fatalClosedPiper PA-23 · Spencer, MANTSB NYC74AN032Accident · 1 fatalClosedSikorsky S-55B · Nemacolin, PANTSB DEN74AD015Accident · 1 fatalClosedPiper PA-28 · Holyoke, CONTSB CHI74AC034Accident · 8 fatalClosedBeech 95-B55 · Inkster, MINTSB CHI74AC033Accident · 1 fatalClosedBeech D35 · Aurora, WINTSB NYC74DFA14Accident · No injuriesClosedPiper PA-28 · Glens Falls, NYNTSB LAX74FUM08Accident · No injuriesClosedBeech M35 · Calexico, CANTSB LAX74DUQ15Accident · Minor injuriesClosedBell 47G-2 · Lake Hughes, CANTSB ANC74AA039Accident · No injuriesClosedPiper PA-32 · Ugashik, AKNTSB NYC74DHA12Accident · No injuriesClosedBlanik L-13 · Erwinna, PANTSB LAX74FUG18Accident · Serious injuriesClosedCessna U206C · Daggett, CA