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 MKC77FER30Accident · No injuriesClosedMooney M20-F · Lake Elmo, MNNTSB DEN77FTE33Accident · No injuriesClosedBlanik L-13 · Boulder, CONTSB NYC77FNE13Accident · No injuriesClosedCessna 172 · Chester, CTNTSB LAX77FA043Accident · Serious injuriesClosedCessna 150H · Van Nuys, CANTSB MKC77DER28Accident · No injuriesClosedCessna 172G · Sandstone, MNNTSB FTW77FRG34Accident · No injuriesClosedPiper PA-30 · Smithville, TXNTSB NYC77FA046Accident · 7 fatalClosedMitsubishi MU-2 · Bronx, NYNTSB MIA770KT46Accident · Serious injuriesClosedAero Comdr 560F · Exuma, Burkina FasoNTSB CHI77FEC25Accident · Serious injuriesClosedMitsubishi MU-2B · Ypsilanti, MINTSB DEN77FQA27Accident · Minor injuriesClosedMooney M20C · Glenwood, NMNTSB MIA77FLD43Accident · Serious injuriesClosedBellanca 14-13 · Merritt Is, FLNTSB CHI77FA038Accident · 2 fatalClosedBrantly B-2 · Tremont, ILNTSB LAX77DUJ41Accident · No injuriesClosedPiper PA-24 · Window Rock, AZNTSB CHI77FEI16Accident · 1 fatalClosedSchweizer SGS233 · Liverpool, OHNTSB ANC77DAG53Accident · No injuriesClosedMaule M-4 · Glenallen, AKNTSB IAD77DLQ08Accident · No injuriesClosedCessna 182G · Bronston, KYNTSB NYC77FGT11Accident · No injuriesClosedPiper PA-28 · Philipsburg, PANTSB FTW77FRA17Accident · Serious injuriesClosedCessna 172 · Bellville, TXNTSB NYC77FHM17Accident · No injuriesClosedCessna 180 · Red Hook, NJNTSB NYC77FGM19Accident · No injuriesClosedEsslstyn RS-15 · Altoona, PANTSB IAD77FA032Accident · 4 fatalClosedPiper PA-28 · Powell, TNNTSB MIA77DLD44Accident · No injuriesClosedPiper PA-28 · Sebastian, FLNTSB LAX77FUQ22Accident · 1 fatalClosedCessna 172M · Inyokern, CANTSB CHI77FEP29Accident · Minor injuriesClosedCessna 172 · Janesville, WINTSB FTW77FA046Accident · 2 fatalClosedNa Rockwell 112 · Spring, TXNTSB DEN77FTE29Accident · Minor injuriesClosedPiper PA-28 · Englewood, CONTSB SEA77DYM22Accident · No injuriesClosedHarmon Stits · Oregon City, ORNTSB SEA77FYA14Accident · No injuriesClosedPiper PA-28 · Emmett, IDNTSB ANC77DAG45Accident · No injuriesClosedPiper PA-12 · Kenai, AKNTSB SEA77DYE13Accident · Minor injuriesClosedHelton LARK95 · Federal Way, WANTSB MIA77FLA21Accident · Minor injuriesClosedPiper PA-28 · Jacksonville, FLNTSB CHI77FA036Accident · 2 fatalClosedBeech 23 · Morris, ILNTSB ANC77DAG39Accident · Minor injuriesClosedPiper PA-12 · Peters Creek, AKNTSB IAD77FIG13Accident · Serious injuriesClosedCessna 172 · Cumberland, MDNTSB CHI77FEP24Accident · Minor injuriesClosedBeech C45H · Milwaukee, WINTSB NYC77FA039Accident · 1 fatalClosedCessna 150 · Rostraver, PANTSB MKC77FER26Accident · Minor injuriesClosedCessna 210F · Rochester, MNNTSB CHI77FEG10Accident · Serious injuriesClosedCessna 182 · Lebanon, OHNTSB MIA77FA046Accident · 1 fatalClosedPiper PA-32 · Charleston, SCNTSB LAX77FA029Accident · 3 fatalClosedBeech F-33A · Needles, CANTSB MKC77DCQ23Accident · No injuriesClosedCessna 180 · Russell, KSNTSB FTW77FA042Accident · 2 fatalClosedMooney MK-21 · El Reno, OKNTSB OAK77FA025Accident · 1 fatalClosedPiper PA-31 · Oakland, CANTSB NYC77FHD13Accident · No injuriesClosedCessna 150L · Coatesville, PANTSB CHI77FEC20Accident · Serious injuriesClosedRockwell 500-S · Mt. Clemens, MINTSB CHI77DEX15Accident · No injuriesClosedPiper PA-28 · Monon, INNTSB NYC77FFJ13Accident · No injuriesClosedPiper PA-22 · Jamestown, NYNTSB IAD77FKM12Accident · No injuriesClosedAce E · Hendersonville, NCNTSB CHI77FEE12Accident · Serious injuriesClosedBeech A90 · Kankakee, ILNTSB CHI77FA035Accident · 2 fatalClosedPiper PA-28 · Rochester, IN