NTSB investigations
20,996 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 CHI71DDJ43Accident · Minor injuriesClosedCessna A150K · Appleton, WINTSB MIA71AM069Accident · 1 fatalClosedCessna 170B · Clinton, MSNTSB IAD71DID20Accident · Minor injuriesClosedTaylorcraft BC12-D · Ararat, VANTSB FTW71DRG78Accident · No injuriesClosedPiper J-3 · Lytle, TXNTSB LAX71FUM26Accident · No injuriesClosedCessna 150 · Chula Vista, CANTSB MKC71FCJ45Accident · No injuriesClosedAero Cmdr 1121 · Omaha, NENTSB MIA71DKG61Accident · No injuriesClosedCessna 310 · Cornelia, GANTSB MIA71AM065Accident · 6 fatalClosedAero Comdr 520 · Columbia, SCNTSB NYC71FHM17Accident · No injuriesClosedBeech G35 · Morristown, NJNTSB NYC71FGM29Accident · Serious injuriesClosedLuscombe 8E · Dubois, PANTSB CHI71FBJ54Accident · Serious injuriesClosedCessna 421 · Reed City, MINTSB NYC71FFA44Accident · Serious injuriesClosedBeech 65 · Newport, VTNTSB IAD71FLJ12Accident · Minor injuriesClosedCessna 172G · Wilmington, NCNTSB DEN71FXT19Accident · No injuriesClosedPiper PA-24 · Monument Vly, UTNTSB MIA71FKJ39Accident · Minor injuriesClosedCessna 150 · Brownsboro, ALNTSB LAX71FUQ55Accident · Minor injuriesClosedCessna 150 · Pacoima, CANTSB LAX71FUG39Accident · No injuriesClosedPiper PA-24 · Rialt0, CANTSB NYC71AN084Accident · 2 fatalClosedCessna 310L · Mountoursville, PANTSB FTW71FPD34Accident · No injuriesClosedCessna 310J · Saginaw, TXNTSB CHI71FGA16Accident · Minor injuriesClosedPiper PA-28 · Chillicothe, OHNTSB MKC71AK042Accident · 1 fatalClosedPiper PA-28 · Columbus, NENTSB MIA71DKT35Accident · Minor injuriesClosedPiper PA-12 · Belle Glade, FLNTSB IAD71AI036Accident · 2 fatalClosedPiper PA-28 · Asheboro, NCNTSB MKC71FDM44Accident · Minor injuriesClosedChampion 7AC · Pillager, MNNTSB MKC71AK041Accident · 4 fatalClosedBeech 35 · St.Charles, MONTSB MIA71FLA30Accident · Serious injuriesClosedPiper PA-28 · Pensacola, FLNTSB FTW71DPM19Accident · No injuriesClosedPiper PA-28 · Bernice, OKNTSB CHI71DBD54Accident · No injuriesClosedPiper J3C-65 · Rockford, ILNTSB FTW71FPG34Accident · No injuriesClosedErcoupe 415-C · Earle, ARNTSB LAX71FUG35Accident · Serious injuriesClosedPiper PA-28 · Corona, CANTSB OAK71DVG48Accident · No injuriesClosedMooney M20F · Sacramento, CANTSB LAX71FUA43Accident · Minor injuriesClosedCessna 320 · Santa Ana, CANTSB OAK71DVG47Accident · No injuriesClosedAmer Avco AA-1 · Wilton, CANTSB LAX71FUM22Accident · Serious injuriesClosedMooney M20A · Brawley, CANTSB DEN71FQA42Accident · No injuriesClosedPiper PA-28 · Albuquerque, NMNTSB NYC71DHD35Accident · Minor injuriesClosedNavion A · Vincentown, NJNTSB CHI71AC053Accident · 1 fatalClosedPiper PA-22 · Dyckesville, WINTSB MIA71FKG57Accident · Serious injuriesClosedCessna 172 · Statesboro, GANTSB MIA71AM060Accident · 2 fatalClosedAero Comdr 500B · Jackson, TNNTSB FTW71AF037Accident · Serious injuriesClosedBeech 99A · Killeen, TXNTSB NYC71DFG12Accident · No injuriesClosedPiper PA-28 · Belfast, MENTSB MKC71AK037Accident · 2 fatalClosedBeech 35 · Wheaton, MNNTSB OAK71FVW22Accident · No injuriesClosedCessna 150K · No.Las Vegas, NVNTSB MIA71FKW30Accident · No injuriesClosedBeech B35 · Greeneville, TNNTSB MIA71AM057Accident · 2 fatalClosedCessna 172K · High Springs, FLNTSB DCA71AZ008Accident · Serious injuriesClosedDouglas DC-3C · New York, NYNTSB NYC71IN076Incident · No injuriesClosedCessna 150 · Danbury, CTNTSB LAX71DUJ54Accident · No injuriesClosedMooney A2A · Tucson, AZNTSB SEA71FWD25Accident · No injuriesClosedPiper PA-24 · Auburn, WANTSB MKC71DCA23Accident · No injuriesClosedCessna 140 · Steffenville, MO