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 CHI80FEM39Accident · Serious injuriesClosedCorbin E · Hessel, MINTSB MIA80DLA32Accident · No injuriesClosedCessna 210D · Gainesville, FLNTSB ANC80DAG92Accident · No injuriesClosedCessna 170B · Palmer, AKNTSB LAX80FXQ33Accident · Minor injuriesClosedCessna 414 · Minden, NVNTSB FTW80IA101Incident · No injuriesClosedCessna 182Q · Brownwood, TXNTSB DEN80FTA18Accident · Serious injuriesClosedPiper PA-25 · Sidney, MTNTSB MIA80DLD84Accident · No injuriesClosedCessna 152 · Ft.Pierce, FLNTSB ANC80DAG91Accident · Minor injuriesClosedPiper PA-18 · Kodiak, AKNTSB FTW80FPD40Accident · No injuriesClosedCessna 150L · Wichita Falls, TXNTSB DEN80FTC25Accident · No injuriesClosedPiper PA-28R · Encampment, WYNTSB CHI80FEV33Accident · No injuriesClosedCessna 172M · Litchfield, ILNTSB ATL80DKM22Accident · No injuriesClosedPiper PA-28 · Liberty, NCNTSB ATL80FA081Accident · 1 fatalClosedPiper PA-38 · Charlottesvle, VANTSB NYC80FNA19Accident · No injuriesClosedCessna 150 · Middleboro, MANTSB MKC80DCQ27Accident · No injuriesClosedCessna 140 · El Dorado, KSNTSB MKC80DCQ26Accident · No injuriesClosedCessna 152 · Norwick, KSNTSB CHI80FEI31Accident · Minor injuriesClosedCessna 172H · Willoughby, OHNTSB SEA80DYA24Accident · No injuriesClosedPiper J3C-65 · Blackfoot, IDNTSB DEN80FTK19Accident · Minor injuriesClosedBeech B19 · Mobridge, SDNTSB DEN80FA053Accident · Minor injuriesClosedAerospatle 315B · Dell, MTNTSB CHI80FEP46Accident · 1 fatalClosedSkyhopper 20 · Oshkosh, WINTSB CHI80FEP45Accident · 2 fatalClosedVari-Eze 01 · Oshkosh, WINTSB ATL80FLT11Accident · Minor injuriesClosedPiper PA-23 · Jackson, TNNTSB ATL80FLQ24Accident · Serious injuriesClosedPiper PA-28 · Louisville, KYNTSB ANC80DAG88Accident · Minor injuriesClosedTaylorcraft F19 · Wasilla, AKNTSB MKC80DCD27Accident · No injuriesClosedPiper PA-28R · Humboldt, IANTSB CHI80FEV32Accident · No injuriesClosedPiper PA-22 · Pontiac, ILNTSB ATL80FLT10Accident · No injuriesClosedBeech 23 · Holly Springs, MSNTSB FTW80FA097Accident · 1 fatalClosedCessna 182Q · Vidalia, LANTSB SEA80DYM51Accident · No injuriesClosedCessna 150L · Tigard, ORNTSB MKC80FCA24Accident · Minor injuriesClosedBensen B8M · Chesterfield, MONTSB LAX80FA127Accident · 4 fatalClosedBeech 95 · Rubidoux, CANTSB SEA80DYA20Accident · No injuriesClosedWeatherly 201B · Mountain Home, IDNTSB LAX80FVG58Accident · Serious injuriesClosedGrum-Amer AA-1 · Lincoln, CANTSB ATL80FA078Accident · 3 fatalClosedPiper PA-28 · Pikeville, KYNTSB DCA80AA022Accident · 3 fatalClosedPiper PA-31 · Philadelphia, PANTSB ATL80FLG16Accident · Serious injuriesClosedPiper PA-28 · Galivant Ferry, SCNTSB CHI80FA059Accident · 2 fatalClosedCessna T310 · Cahokia, ILNTSB ANC80IA073Incident · No injuriesClosedFairchild C-82A · Aniak, AKNTSB MKC80DCG35Accident · No injuriesClosedStinson 108 · Liberty, MONTSB LAX80FA125Accident · 2 fatalClosedSkybolt 01 · Rialto, CANTSB CHI80FET22Accident · No injuriesClosedPiper PA-28 · Peru, INNTSB LAX80FVD31Accident · Minor injuriesClosedBeech D-17S · San Rafael, CANTSB ATL80DKG14Accident · No injuriesClosedPiper PA-25 · Dudley, GANTSB ANC80DAG90Accident · Minor injuriesClosedPiper PA-18 · Seward, AKNTSB SEA80FYE43Accident · Minor injuriesClosedPiper PA-28 · Gardner, WANTSB CHI80FEM35Accident · No injuriesClosedCessna U206B · Charlotte, MINTSB LAX80FA124Accident · 1 fatalClosedCessna 150H · Fullerton, CANTSB ATL80DKW17Accident · No injuriesClosedCessna 170 · Tazewell, TNNTSB ATL80FKG10Accident · No injuriesClosedCessna 150H · Stockbridge, GA