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 OAK75FVD19Accident · No injuriesClosedCessna 210 · Hoopa, CANTSB SEA75FYE19Accident · Serious injuriesClosedCessna 150 · Snohomish, WANTSB OAK75FVD14Accident · Serious injuriesClosedMorrisey 2150 · Lodi, CANTSB CHI75FEP25Accident · No injuriesClosedStinson V-77 · Belleville, WINTSB ANC75DAG41Accident · No injuriesClosedPiper PA-16 · Port Ashton, AKNTSB MIA75FKQ15Accident · Serious injuriesClosedCessna 320C · Natchez, MSNTSB LAX75AL017Accident · 1 fatalClosedCessna 340 · Phoenix, AZNTSB ANC74AA029Accident · No injuriesClosedPiper PA-18 · Kenai, AKNTSB NYC75FNE11Accident · Minor injuriesClosedErco 415-C · Ansonia, CTNTSB LAX75DUG13Accident · No injuriesClosedCessna 182 · Corona, CANTSB NYC75DFA14Accident · No injuriesClosedSchweizer SGS233 · Saratoga Sprng, NYNTSB FTW75FPJ06Accident · Minor injuriesClosedCessna 182A · Stroud, OKNTSB MKC75FCG14Accident · Serious injuriesClosedPiper PA-31 · Duenweg, MONTSB NYC75AN038Accident · 4 fatalClosedBeech D50E · Clarksburg, NJNTSB MKC75FCQ16Accident · Serious injuriesClosedCessna 140 · Moline, KSNTSB MIA75DKJ24Accident · No injuriesClosedPitts S-2A · Gurley, ALNTSB LAX75AL014Accident · 5 fatalClosedPiper PA-32 · Riverside, CANTSB CHI75FEI18Accident · No injuriesClosedPiper PA-24 · Sebring, OHNTSB SEA75FTA09Accident · No injuriesClosedCessna 180D · Circle, MTNTSB MKC75DCQ17Accident · No injuriesClosedErco 415-C · Hill City, KSNTSB ANC75FAG33Accident · Serious injuriesClosedPiper PA-18 · Skwentna, AKNTSB OAK75DVA18Accident · No injuriesClosedCessna 185 · Lone Pine, CANTSB FTW75FPM05Accident · No injuriesClosedTern II · Tulsa, OKNTSB CHI75FEP23Accident · Serious injuriesClosedCessna 150E · Milwaukee, WINTSB CHI75FEP22Accident · 1 fatalClosedCessna 182H · West Bend, WINTSB DCA75AZ009Accident · 71 fatalClosedDouglas DC9-31 · Charlotte, NCNTSB NYC75FHM07Accident · No injuriesClosedBell 206B · Moonachie, NJNTSB NYC75DHA15Accident · No injuriesClosedPiper PA-32 · Clarks Summit, PANTSB DEN75AD010Accident · Minor injuriesClosedCessna 402 · Littleton, CONTSB CHI75FEE22Accident · No injuriesClosedCessna 182M · Channahon, ILNTSB NYC75AN034Accident · 1 fatalClosedPiper PA-28 · Allentown, PANTSB IAD75FIA06Accident · No injuriesClosedCessna 172B · Clinton, MDNTSB DEN75FTM05Accident · No injuriesClosedPiper PA-28 · Salt Lake City, UTNTSB OAK75DXQ23Accident · No injuriesClosedPiper PA-28 · Mammoth Lks, CANTSB FTW75FRG18Accident · Minor injuriesClosedNavion G · New Braunfels, TXNTSB ANC75DAG51Accident · Minor injuriesClosedStinson 108-3 · Skwenta, AKNTSB IAD75DLJ02Accident · No injuriesClosedCallair A-9 · Beaulahville, NCNTSB CHI75FEE19Accident · Serious injuriesClosedPiper PA-28 · Elgin, ILNTSB ANC75DAG34Accident · No injuriesClosedCessna 180 · Nondalton, AKNTSB FTW75DQG19Accident · No injuriesClosedBellanca 17-30 · Morton, TXNTSB SEA75DYA17Accident · No injuriesClosedPiper PA-24 · Rockland, IDNTSB NYC75DHD16Accident · No injuriesClosedCessna 177 · Philadelphia, PANTSB NYC75AN029Accident · 4 fatalClosedPiper PA-24 · Phillipsburg, PANTSB NYC75AN012Accident · 1 fatalClosedPiper PA-32 · Somerset, PANTSB DEN75DQA13Accident · No injuriesClosedSchweizer SGS232 · Albuquerque, NMNTSB CHI75FEC12Accident · Serious injuriesClosedPitts S-1S · Pontiac, MINTSB ANC75AA021Accident · Minor injuriesClosedHiller Acft UH-12E · Ketchikan, AKNTSB LAX75DUM04Accident · Serious injuriesClosedCessna 150 · Calexico, CANTSB DEN75AD008Accident · 1 fatalClosedCessna 172 · Parowan, UTNTSB NYC75AN025Accident · No injuriesClosedGoodyr Acft GZ-20A · Flushing, NY