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 LAX75DUJ77Accident · No injuriesClosedCessna 210 · Phoenix, AZNTSB CHI76FEI42Accident · Minor injuriesClosedPiper PA-28 · Wauseon, OHNTSB ANC75DAG81Accident · No injuriesClosedStinson 108-3 · Iliamna, AKNTSB OAK75FVG53Accident · No injuriesClosedCessna 320C · Chico, CANTSB IAD75FIA16Accident · No injuriesClosedPiper PA-32 · Warrenton, VANTSB DEN75DQD22Accident · No injuriesClosedCessna 150 · Carlsbad, NMNTSB DEN75AD052Accident · No injuriesClosedBell 206B · Gobernador, NMNTSB LAX75FUJ70Accident · Minor injuriesClosedPiper PA-30 · Douglas, AZNTSB NYC75AN097Accident · 1 fatalClosedCessna 337 · North Boston, NYNTSB MIA75FLG30Accident · Minor injuriesClosedPiper PA-28R · North, SCNTSB LAX75AL051Accident · 2 fatalClosedBeech B35 · Hawthorne, CANTSB NYC75AN096Accident · 1 fatalClosedPiper PA-28R · Mastic, NYNTSB MIA75FKG66Accident · No injuriesClosedSchweizer SGS2 · Williamson, GANTSB MIA75AKJ53Accident · No injuriesClosedLuscombe 8E · Lacey Springs, ALNTSB LAX75FUM22Accident · Minor injuriesClosedSchweizer SGS126 · San Diego, CANTSB LAX75DUJ74Accident · Serious injuriesClosedAmer Avco AA1-A · Gila Bend, AZNTSB FTW75FQG49Accident · No injuriesClosedCessna 140 · Midland, TXNTSB FTW75AF060Accident · Serious injuriesClosedBell 206B · Grand Chenier, LANTSB MIA75FKA07Accident · No injuriesClosedBeech B95 · Arecibo, PRNTSB MIA75FKG65Accident · No injuriesClosedCessna 172L · Calhoun, GANTSB MIA75DKG64Accident · No injuriesClosedCessna 206 · Thomasville, GANTSB CHI75AC075Accident · 1 fatalClosedPiper PA-28 · Medina, OHNTSB SEA75FYE37Accident · No injuriesClosedPine Air Superv · Oak Harbor, WANTSB MKC75DCJ50Accident · No injuriesClosedPiper PA-32 · Arnold, NENTSB FTW75FRA22Accident · 1 fatalClosedGrumman G-164A · El Campo, TXNTSB ANC75AA071Accident · No injuriesClosedCurtiss-Wrt C-46 · Deadhorse, AKNTSB MIA750KJ50Accident · Minor injuriesClosedPiper PA-28 · Jasper, ALNTSB ANC75AA070Accident · No injuriesClosedBell 206B · Allison Lake, AKNTSB NYC75FHD39Accident · No injuriesClosedBeech B55 · Blue Bell, PANTSB MKC75AK050Accident · 2 fatalClosedBeech A36 · Wichita, KSNTSB OAK75FVG49Accident · Minor injuriesClosedChampion 7GCAA · Fairfield, CANTSB CHI75AC071Accident · 1 fatalClosedBeech A23 · Troy, OHNTSB NYC75FHD38Accident · No injuriesClosedPiper PA-24 · Bridgeport, NJNTSB LAX75FUA23Accident · No injuriesClosedCessna 150J · Santa Ana, CANTSB FTW75FPM12Accident · No injuriesClosedPiper PA-22 · Tulsa, OKNTSB CHI75AC070Accident · 3 fatalClosedCessna 337D · Stambaugh, MINTSB ANC75AA068Accident · 1 fatalClosedBellanca 7KCAB · Sitka, AKNTSB NYC75FNE31Accident · No injuriesClosedFunk B-85C · Westboro, MANTSB MKC75DER60Accident · No injuriesClosedCessna 310 · Minneapolis, MNNTSB CHI75FEV24Accident · No injuriesClosedPiper PA-28 · Bloomington, ILNTSB OAK75DVD39Accident · No injuriesClosedGrum Amer AA1-B · Tracy, CANTSB CHI75FEI38Accident · No injuriesClosedPiper PA-24 · Cleveland, OHNTSB CHI75EEP50Accident · No injuriesClosedErco 415-C · Oconto, WINTSB ANC75AA066Accident · No injuriesClosedBeech D50C · Nondalton, AKNTSB NYC75FFA31Accident · Minor injuriesClosedLuscombe 8A · Duanesburg, NYNTSB SEA75AS034Accident · 1 fatalClosedCessna 150L · Albany, ORNTSB MKC75DCA21Accident · Minor injuriesClosedPiper PA-28R · Kennett, MONTSB LAX75AUJ68Accident · No injuriesClosedPiper PA-30 · Phoenix, AZNTSB MKC75FCQ37Accident · Minor injuriesClosedHughes 269A · Hutchinson, KSNTSB IAD75FIJ14Accident · No injuriesClosedCessna 182H · Charleston, WV