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 IAD75DIG22Accident · Minor injuriesClosedPiper PA-22 · Swanton, MDNTSB NYC75DNC38Accident · No injuriesClosedCessna A150 · Shelbourne, VTNTSB CHI75FEE70Accident · No injuriesClosedBeech B95 · Crystal Lake, ILNTSB ANC75FAA35Accident · Minor injuriesClosedCessna 172L · Circle City, AKNTSB NYC75FHA46Accident · Serious injuriesClosedBeech 95-C55 · Basking Ridge, NJNTSB NYC75FFA43Accident · No injuriesClosedCessna 206 · Manorkill, NYNTSB MKC75FCG51Accident · Minor injuriesClosedCessna 172 · Leawood, KSNTSB FTW75AF074Accident · No injuriesClosedCessna 182 · Fayetteville, ARNTSB SEA75DYE48Accident · Minor injuriesClosedCessna 150 · Blaine, WANTSB OAK75FVM35Accident · Minor injuriesClosedPiper PA-28 · San Jose, CANTSB NYC75AN118Accident · Serious injuriesClosedPiper PA-28 · Export, PANTSB CHI75FEC58Accident · No injuriesClosedCessna 150L · Ypsilanti, MINTSB NYC75FFJ24Accident · Serious injuriesClosedPiper J-3 · Gasport, NYNTSB DEN75DTC27Accident · No injuriesClosedCessna 177 · Laramie, WYNTSB OAK75FVG76Accident · No injuriesClosedCessna 150 · Antioch, CANTSB CHI75DEK34Accident · No injuriesClosedPiper PA-20 · Chesterville, OHNTSB NYC75AN120Accident · No injuriesClosedTed Smith 600 · Philadelphia, PANTSB CHI75FEP68Accident · Serious injuriesClosedGrum Amer AA1 · Delavan, WINTSB FTW75FQG58Accident · No injuriesClosedCessna 182 · Crane, TXNTSB MIA75DLG36Accident · No injuriesClosedSchweizer 2-33 · Chester, SCNTSB MIA75FKT89Accident · Serious injuriesClosedCessna 150 · Lantana, FLNTSB FTW75DPJ24Accident · Serious injuriesClosedPiper PA-18 · Hough, OKNTSB /AK75FVA67Accident · No injuriesClosedCessna 172H · Merced, CANTSB OAK75FVW22Accident · No injuriesClosedCessna 320F · Las Vegas, NVNTSB NYC75FHD51Accident · No injuriesClosedAeronca 7BCM · Pennington, NJNTSB IAD75DIA23Accident · Minor injuriesClosedCessna 150J · Clinton, MDNTSB FTW75FRG85Accident · Minor injuriesClosedBeech S35 · Sinton, TXNTSB FTW75AF070Accident · 1 fatalClosedPiper PA-28 · Bryan, TXNTSB CHI75DEC52Accident · No injuriesClosedPiper PA-22 · Linden, MINTSB IAD7KFHD49Accident · Serious injuriesClosedMooney M20 · Garrison Lake, DENTSB FTW75FPG75Accident · No injuriesClosedPiper PA-25 · Tamo, ARNTSB CHI75FEI56Accident · Minor injuriesClosedBeech J35 · New Phila, OHNTSB SEA7KAS043Accident · 1 fatalClosedPine Air Superv · Omak, WANTSB SEA75DTI31Accident · No injuriesClosedPiper PA-34 · Missoula, MTNTSB OAK75DVD50Accident · Minor injuriesClosedCessna 172 · Concord, CANTSB CHI75FEV32Accident · Serious injuriesClosedBeech A23 · Shelbyville, ILNTSB CHI75FEC51Accident · No injuriesClosedCessna 414 · Lapeer, MINTSB MKC75AK057Accident · Minor injuriesClosedCessna 414 · Omaha, NENTSB SEA75FYC39Accident · No injuriesClosedPiper J3L-65 · Cornelius, ORNTSB OAK75FVM32Accident · No injuriesClosedPiper PA-28 · Santa Cruz, CANTSB FTW75DPD42Accident · No injuriesClosedPiper PA-28 · Grand Prairie, TXNTSB CHI75FEI54Accident · Minor injuriesClosedKanran KR-1 · Wadsworth, OHNTSB MIA75FLD76Accident · Minor injuriesClosedGrum Amer AA1-B · Tampa, FLNTSB LAX75DUJ83Accident · Serious injuriesClosedMooney M20E · Coolidge, AZNTSB CHI75FEK28Accident · Serious injuriesClosedPiper PA-28 · Mt Gilead, OHNTSB CHI75FEC49Accident · Serious injuriesClosedCessna 140 · Tecumseh, MINTSB MKC75FCG47Accident · Minor injuriesClosedCessna 150 · Kansas City, KSNTSB FTW75AF067Accident · 4 fatalClosedCessna 177RG · Tomball, TXNTSB MIA75FLD77Accident · No injuriesClosedCessna 177 · Lakeland, FLNTSB CHI75DEM43Accident · No injuriesClosedLuscombe 8A · Oshtemo, MI