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 NYC81FFJ18Accident · Minor injuriesClosedAeronca 7DC · Albion, NYNTSB DEN81DTI16Accident · No injuriesClosedCessna 182 · Great Falls, MTNTSB FTW81FQA36Accident · No injuriesClosedPiper PA-28 · Albuquerque, NMNTSB CHI81FEC33Accident · Minor injuriesClosedCessna 152 · Wixom, MINTSB ATL81FKG31Accident · Serious injuriesClosedCessna 177 · Cummings, GANTSB DEN81FTE56Accident · Minor injuriesClosedPiper 601P · Crested Butte, CONTSB CHI81IA074Incident · No injuriesClosedBoeing 747 · Minneapolis, MNNTSB CHI81DEP31Accident · No injuriesClosedCessna 172A · Franklin, WINTSB NYC81FFJ17Accident · No injuriesClosedTaylorcraft BC12-D · Penn Yan, NYNTSB ANC81FAA20Accident · No injuriesClosedPiper PA-31 · Ruby, AKNTSB ANC81FA077Accident · No injuriesClosedCessna 177RG · Anchorage, AKNTSB FTW81FRG51Accident · Serious injuriesClosedPiper PA-18 · Johnson City, TXNTSB NYC81DHA16Accident · No injuriesClosedVariviggen BWR-1 · Reading, PANTSB FTW81FRD31Accident · Minor injuriesClosedCessna 140 · Kinder, LANTSB CHI81FEC32Accident · No injuriesClosedCessna 172N · Lambertville, MINTSB NYC81FA071Accident · 1 fatalClosedTaylorcraft BC-85 · Durham, NHNTSB MIA81FA090Accident · 1 fatalClosedMooney M20J · St.Petersburg, FLNTSB MIA81FKT82Accident · 1 fatalClosedBuehler Exec · Ft Lauderdale, FLNTSB MIA81DKJ11Accident · Minor injuriesClosedPiper PA-25 · Navarre, FLNTSB ANC81FA088Accident · No injuriesClosedHughes 500D · Farewell, AKNTSB LAX81FVW14Accident · Minor injuriesClosedCessna P210N · Tonopah, NVNTSB LAX81DUG31Accident · No injuriesClosedPiper PA-24 · Chino, CANTSB ATL81FKJ38Accident · Serious injuriesClosedCessna U206 · Elberta, ALNTSB NYC81FA068Accident · 3 fatalClosedBeech A24R · Manahawkin, NJNTSB ATL81FLG14Accident · Minor injuriesClosedRockwell S2R · Ridgeland, SCNTSB LAX81FUJ80Accident · No injuriesClosedCessna 210 · Showlow, AZNTSB FTW81DRA41Accident · No injuriesClosedCessna 150 · League City, TXNTSB ATL81FA086Accident · Serious injuriesClosedLuscombe 8A · Tifton, GANTSB NYC81FFJ13Accident · No injuriesClosedGrumman AA-5A · Batavia, NYNTSB NYC81FFJ14Accident · No injuriesClosedCurtiss Pusher · Endicott, NYNTSB LAX81FUA11Accident · No injuriesClosedBeech 35 · Long Beach, CANTSB ATL81FLG13Accident · Serious injuriesClosedQuail 1 · Greer, SCNTSB MIA81DKJ10Accident · No injuriesClosedGrumman G-164A · Vernon, FLNTSB DEN81FTK13Accident · 1 fatalClosedPiper PA-28 · Rapid City, SDNTSB FTW81DPD28Accident · Minor injuriesClosedCessna 152 · Roanoke, TXNTSB ANC81DAG45Accident · No injuriesClosedMaule M-5 · Eagle River, AKNTSB LAX81FVG46Accident · No injuriesClosedMaule M5-235 · Redding, CANTSB LAX81DUJ68Accident · No injuriesClosedPiper PA-28 · Elgin, AZNTSB LAX81DUJ69Accident · No injuriesClosedCessna 150L · Bullhead City, AZNTSB LAX81DVA48Accident · No injuriesClosedPiper PA-36 · Hanford, CANTSB FTW81DA107Accident · Minor injuriesClosedCessna 150 · Angleton, TXNTSB DEN81FTK11Accident · Minor injuriesClosedCessna 182Q · Rapid City, SDNTSB NYC81FHD28Accident · Minor injuriesClosedCessna 150 · Hamilton Sq, NJNTSB FTW81FPJ28Accident · Serious injuriesClosedCessna 182A · Thomas, OKNTSB MIA81FA084Accident · Serious injuriesClosedCessna 172N · Key Largo, FLNTSB ATL81FLT11Accident · No injuriesClosedCessna 310R · Olive Branch, MSNTSB ATL81FA081Accident · No injuriesClosedPiper PA-23 · Manassas, VANTSB ATL81DKG24Accident · Minor injuriesClosedGrum Amer AA-5A · Cochran, GANTSB NYC81FGM20Accident · Minor injuriesClosedBensen B8M · Greenville, PANTSB FTW81FRJ19Accident · No injuriesClosedCessna 182 · Simsboro, LA