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 MKC70FCA17Accident · Serious injuriesClosedCessna 182L · Hillsboro, MONTSB LAX70FUM12Accident · No injuriesClosedCessna A-188 · Calipatria, CANTSB MKC70DCJ32Accident · No injuriesClosedPiper PA-28 · S.Sioux City, NENTSB FTW71FPJ05Accident · Serious injuriesClosedStinson 108-1 · Edmond, OKNTSB SEA70DWD21Accident · No injuriesClosedCessna 150 · Snohomish, WANTSB MKC70DCG33Accident · No injuriesClosedLuscombe 8E · Amsterdam, MONTSB MIA70FKQ12Accident · No injuriesClosedCessna 401 · Brookhaven, MSNTSB CHI70DDJ25Accident · No injuriesClosedCessna 182 · Milwaukee, WINTSB OAK70FXQ18Accident · Minor injuriesClosedCessna 182K · Truckee, CANTSB MKC70DCD41Accident · Minor injuriesClosedAlon A-2 · Osceola, IANTSB IAD70DID22Accident · Minor injuriesClosedAlon A-2 · Hopewell, VANTSB SEA70DWG18Accident · Minor injuriesClosedLuscombe 8E · Okanogan, WANTSB SEA70DDA17Accident · No injuriesClosedPiper PA-18 · Poplar, MTNTSB OAK70DVD28Accident · No injuriesClosedBensen B-8M · Tracy, CANTSB NYC70FGM23Accident · No injuriesClosedPiper PA-28 · West Mifflin, PANTSB CHI70FBJ88Accident · Minor injuriesClosedChampion 7FC · Bath, MINTSB CHI70DBD47Accident · No injuriesClosedPitts Spcl · Monee, ILNTSB SEA70FWA16Accident · No injuriesClosedHughes 269A · St Johns, ORNTSB OAK70FXQ17Accident · No injuriesClosedCessna 177 · Reno, NVNTSB MKC70FDD18Accident · No injuriesClosedPiper PA-25 · Casselton, NDNTSB LAX70FUJ44Accident · No injuriesClosedPiper PA-24 · Glendale, AZNTSB LAX70DUG54Accident · No injuriesClosedPiper PA-28 · Adelanto, CANTSB FTW70DQG20Accident · Minor injuriesClosedPiper PA-28 · Dimmitt, TXNTSB SEA70FXM20Accident · 1 fatalClosedGrumman TBM · Boise, IDNTSB SEA70FWD20Accident · No injuriesClosedAero Comdr 560 · Bellevue, WANTSB CHI70FBA24Accident · Minor injuriesClosedCessna 170B · Greenwood, INNTSB MIA70FKT26Accident · Minor injuriesClosedPiper PA-28 · W.Hollywood, FLNTSB DEN70DVW20Accident · No injuriesClosedCessna 172 · Cedar City, UTNTSB CHI70AC091Accident · No injuriesClosedCessna 150G · Burlington, WINTSB OAK70FVG34Accident · Serious injuriesClosedCessna 150C · Napa, CANTSB MKC70FDQ10Accident · Serious injuriesClosedAeronca 7CCM · Hayes, SDNTSB CHI70FBQ22Accident · No injuriesClosedPiper PA-28 · Mattoon, ILNTSB MKC70DCQ27Accident · No injuriesClosedPiper J3C-65 · Sterling, KSNTSB SEA70AS047Accident · 3 fatalClosedMeyers OTW · Scappoose, ORNTSB NYC70DHD42Accident · No injuriesClosedPiper PA-28 · Moorestown, NJNTSB CHI70FGJ15Accident · Serious injuriesClosedAeronca 65-TAC · Lebanon, KYNTSB FTW70FRA31Accident · No injuriesClosedCessna 150J · Houston, TXNTSB FTW70FPD16Accident · No injuriesClosedCessna 150 · Fort Worth, TXNTSB LAX70FUG44Accident · No injuriesClosedPiper PA-28 · Hesperia, CANTSB MKC70DCD38Accident · No injuriesClosedCessna 172F · Harlan, IANTSB FTW70FQG22Accident · No injuriesClosedAmer Avco AA-1 · Lubbock, TXNTSB DEN70FQA26Accident · No injuriesClosedCessna 150 · Albuquerque, NMNTSB CHI70FBD41Accident · Serious injuriesClosedAeronca 11AC · Arlington, ILNTSB CHI70DGD01Accident · No injuriesClosedBeech 33 · Cleveland, OHNTSB NYC70FHJ10Accident · Minor injuriesClosedCessna 150 · Farmingdale, NYNTSB MKC70FDM32Accident · No injuriesClosedBeech 35-33 · Rochester, MNNTSB ANC70DAG36Accident · No injuriesClosedPiper PA-18 · Russian Mssn, AKNTSB NYC70FFJ12Accident · No injuriesClosedCessna 150 · Geneva, NYNTSB MKC70AK069Accident · 2 fatalClosedPiper PA-28 · Lyndon, KSNTSB LAX70DUJ40Accident · No injuriesClosedPiper PA-28 · Maricopa, AZ