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 NYC73DNC54Accident · No injuriesClosedMooney M20E · Biddeford, MENTSB CHI73DEP41Accident · Serious injuriesClosedPiper PA-28 · Hermosa, MexicoNTSB LAX73FUG38Accident · No injuriesClosedHarvard MK4 · Rubidoux, CANTSB DEN73AD040Accident · 1 fatalClosedCessna A150K · Pueblo, CONTSB SEA73FYI11Accident · Serious injuriesClosedCessna 120 · Norway, ORNTSB FTW73FPA24Accident · No injuriesClosedPiper PA-28 · Dallas, TXNTSB FTW73DRG51Accident · No injuriesClosedPiper PA-24 · Uvalde, TXNTSB DEN73DTM20Accident · No injuriesClosedCessna 182 · Brigham City, UTNTSB SEA73AS023Accident · 4 fatalClosedCessna 320E · Walla Walla, WANTSB NYC73FIJ18Accident · Serious injuriesClosedCessna 172 · Ripley, WVNTSB NYC73FIA10Accident · No injuriesClosedCessna 150L · Manassas, VANTSB MKC73DCG28Accident · No injuriesClosedPiper PA-22 · Osceola, MONTSB FTW73FPJ09Accident · Minor injuriesClosedPiper PA-28 · Duncan, OKNTSB CHI73FEM29Accident · No injuriesClosedPiper PA-28 · Harbor Spgs, MINTSB LAX73AL038Accident · 1 fatalClosedCessna 150L · Murrieta, CANTSB MIA73AM081Accident · 4 fatalClosedBeech D18S · Paris, TNNTSB CHI73DET25Accident · Minor injuriesClosedCessna 340 · Fremont, OHNTSB OAK73FVG45Accident · Minor injuriesClosedAero Comdr 100 · Dorris, CANTSB SEA73AS021Accident · 1 fatalClosedBellanca 7GCBC · Brockway, MTNTSB MIA73FKG58Accident · No injuriesClosedCessna 150F · Alma, GANTSB FTW73FQG29Accident · Minor injuriesClosedPiper PA-28R · Odessa, TXNTSB SEA73DYA16Accident · Minor injuriesClosedStinson 108-3 · New Meadows, IDNTSB CHI73FEM43Accident · Serious injuriesClosedCessna 172H · Mcbain, MINTSB LAX73FUA30Accident · No injuriesClosedMooney M20C · Buena Park, CANTSB MKC73DER37Accident · No injuriesClosedCessna 150L · Fertile, MNNTSB DEN73FTE49Accident · Serious injuriesClosedBeech J35 · Broomfield, CONTSB MIA73FKT56Accident · No injuriesClosedPiper PA-30 · Opa Locka, FLNTSB CHI73FEK14Accident · Serious injuriesClosedCessna 177RG · Blacklick, OHNTSB FTW73FQG30Accident · Minor injuriesClosedMooney M20C · Dalhart, TXNTSB CHI73AC066Accident · 1 fatalClosedCessna 207 · Marion, ILNTSB NYC73DFJ18Accident · Serious injuriesClosedBellanca 17-30 · Dunkirk, NYNTSB ANC73DAG76Accident · No injuriesClosedCessna 305A · Anchorage, AKNTSB MKC73FCG27Accident · Minor injuriesClosedBeech H35 · Grain Valley, MONTSB MKC73DCJ28Accident · No injuriesClosedChampion 7GCAA · No.Platte, NENTSB MIA73AM076Accident · 1 fatalClosedPiper PA-28 · Hartselle, ALNTSB MKC73AK048Accident · 5 fatalClosedCessna 310J · Omaha, NENTSB MIA73FLG32Accident · Serious injuriesClosedPiper PA-28 · No.Myrtle Bch, SCNTSB NYC73FFJ17Accident · Minor injuriesClosedMooney M20C · Town Of Eden, NYNTSB CHI73DEE41Accident · No injuriesClosedPiper PA-28 · Joliet, ILNTSB LAX73DUM17Accident · No injuriesClosedPiper PA-28 · Valley Ctr, CANTSB LAX73FUJ46Accident · No injuriesClosedCessna 170B · Willcox, AZNTSB ANC73DAG75Accident · No injuriesClosedPiper PA-18A · Glennallen, AKNTSB NYC73DNC48Accident · No injuriesClosedBeech 23 · Claremont, NHNTSB NYC73DFA23Accident · No injuriesClosedAeronca 15AC · Northville, NYNTSB NYC73ANC47Accident · No injuriesClosedCessna 310D · Brewer, MENTSB DEN73FTM15Accident · No injuriesClosedPiper PA-22 · Provo, UTNTSB OAK73AP022Accident · 1 fatalClosedBeech F35 · San Fran, CANTSB NYC73AN101Accident · Serious injuriesClosedPiper PA-22 · Edgewater, MDNTSB MKC73DER34Accident · No injuriesClosedCessna 150G · Lake Elmo, MNNTSB FTW73FRG41Accident · Minor injuriesClosedTaylorcraft BC12-D · San Antonio, TX