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 FTW81FRA39Accident · No injuriesClosedBoeing A75N1 · Hockley, TXNTSB CHI81FET07Accident · Minor injuriesClosedPDQ 2-D · Ligonier, INNTSB CHI81DEP21Accident · Minor injuriesClosedPiper PA-28 · Genoa City, WINTSB FTW81FQD26Accident · Minor injuriesClosedBeech D17S · Canutillo, TXNTSB DEN81FTC16Accident · No injuriesClosedN American P-51D · Casper, WYNTSB LAX81FVG40Accident · Minor injuriesClosedPiper PA-22 · Weaverville, CANTSB CHI81FA062Accident · 2 fatalClosedBellanca 17-31 · Hessel, MINTSB ANC81DA061Accident · No injuriesClosedDouglas DC-3 · Togiak, AKNTSB MIA81FLD47Accident · No injuriesClosedMooney M20E · Tampa, FLNTSB FTW81FQA32Accident · 1 fatalClosedSchleicher ASW-20 · Las Vegas, NMNTSB NYC81DHA13Accident · No injuriesClosedPiper PA-32 · Factoryville, PANTSB FTW81FPM12Accident · No injuriesClosedTed Smith 601 · Miami, OKNTSB ATL81DKQ10Accident · No injuriesClosedPiper PA-38 · Canton, MSNTSB ATL81FID15Accident · No injuriesClosedPiper PA-28 · Lawrenceville, VANTSB ATL81FIA07Accident · No injuriesClosedCessna 320 · Culpeper, VANTSB FTW81FQG31Accident · No injuriesClosedCessna 414 · Wink, TXNTSB LAX81FA089Accident · No injuriesClosedEnstrom F-280C · Bridgeport, CANTSB CHI81FEI17Accident · Serious injuriesClosedCessna T310Q · Middlefield, OHNTSB FTW81FRA31Accident · No injuriesClosedCessna 182A · Houston, TXNTSB MIA81DLA24Accident · No injuriesClosedCessna 172N · Bunnell, FLNTSB FTW81FQA31Accident · Minor injuriesClosedBellanca 17-30 · Chacon, NMNTSB ATL81FA072Accident · 1 fatalClosedPiper PA-30 · Smyrna, TNNTSB LAX81FA085Accident · 4 fatalClosedBeech 58P · Redding, CANTSB FTW81FPG25Accident · Serious injuriesClosedCessna 152 · N Little Rock, ARNTSB LAX81FVG35Accident · Serious injuriesClosedCessna T210M · Orland, CANTSB NYC81FFJ11Accident · Minor injuriesClosedSchweizer 1-35C · Java, NYNTSB DEN81FTM27Accident · Serious injuriesClosedPiper PA-28 · Tooele, UTNTSB FTW81FRA28Accident · 1 fatalClosedBensen B8M · Kirbyville, TXNTSB DEN81DTM23Accident · No injuriesClosedCessna 182P · Monument Vly, UTNTSB FTW81FRJ14Accident · No injuriesClosedCessna 150J · Center, TXNTSB NYC81FFA16Accident · Serious injuriesClosedBeech 77 · Oneonta, NYNTSB ATL81FKG18Accident · No injuriesClosedVarize 01 · Winder, GANTSB NYC81FA044Accident · Serious injuriesClosedPiper PA-23 · Mattituck, NYNTSB DEN81FA031Accident · 1 fatalClosedCessna 152 · Cowley, WYNTSB NYC81FNE17Accident · No injuriesClosedSchweizer 2-33A · New Braintree, MANTSB NYC81DHA11Accident · Minor injuriesClosedCessna 172 · Erwinna, PANTSB LAX81FVM20Accident · No injuriesClosedBeech A35 · Palo Alto, CANTSB LAX81FUJ57Accident · 1 fatalClosedPiper PA-25 · New River, AZNTSB LAX81DUQ21Accident · No injuriesClosedSlingsby T.59.D · California Cty, CANTSB LAX81DUJ55Accident · No injuriesClosedBeech 35 · White Mtn Lke, AZNTSB CHI81FEG11Accident · Serious injuriesClosedPiper PA-28 · New Lebanon, OHNTSB LAX81FA083Accident · 1 fatalClosedPiper PA-38 · Sonora, CANTSB SEA81FYK08Accident · Minor injuriesClosedPiper PA-22 · Medford, ORNTSB MKC81FA032Accident · Minor injuriesClosedCessna 172 · Maryville, MONTSB LAX81DUQ19Accident · No injuriesClosedCessna 150 · Inyokern, CANTSB CHI81FER33Accident · Minor injuriesClosedCessna 180H · Grand Rapids, MNNTSB CHI81FCA06Accident · Minor injuriesClosedPiper PA-28 · Waterloo, ILNTSB FTW81FQA26Accident · No injuriesClosedCessna 172 · Santa Rosa, NMNTSB NYC81FNE16Accident · No injuriesClosedPiper PA-28 · Gardner, MANTSB MKC81DCG32Accident · No injuriesClosedRyan Navion · Atherton, MO