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 FTW71FPD27Accident · Serious injuriesClosedStinson SR-9C · Lake Dallas, TXNTSB OAK71AP026Accident · Minor injuriesClosedPiper PA-28 · Vacaville, CANTSB LAX71DUJ45Accident · No injuriesClosedPiper PA-23 · Tucson, AZNTSB CHI71FBM10Accident · Minor injuriesClosedPiper PA-32 · South Bend, INNTSB OAK71DVW19Accident · No injuriesClosedCessna 182 · Las Vegas, NVNTSB MKC71AK027Accident · 2 fatalClosedRepublic F-105D · Wichita, KSNTSB NYC71AN062Accident · 1 fatalClosedPiper PA-23 · Poestenkill, NYNTSB DEN71DQD14Accident · No injuriesClosedCessna 150E · Las Cruces, NMNTSB LAX71FUA35Accident · Serious injuriesClosedCessna 182 · Tijuana, MexicoNTSB IAD71FIG21Accident · Minor injuriesClosedCessna 172 · Reistertown, MDNTSB FTW71FPD26Accident · No injuriesClosedPiper PA-28 · Denton, TXNTSB DCA71AZ005Accident · 75 fatalClosedDouglas DC-9 · Huntington, WVNTSB CHI71A0033Accident · 2 fatalClosedAero Comdr 1121 · Lexington, KYNTSB NYC71FFJ16Accident · 1 fatalClosedAero Comdr 600S2R · Rochester, NYNTSB NYC71AN060Accident · Serious injuriesClosedBeech G18S · Clinton, PANTSB NYC71AN059Accident · 2 fatalClosedCessna 421 · Bath, PANTSB LAX71FUG22Accident · Minor injuriesClosedBeech V35 · El Monte, CANTSB CHI71AC031Accident · Serious injuriesClosedDehavilland DHC-6 · Lacrosse, WINTSB LAX71IL026Incident · No injuriesClosedBoeing B727 · Los Angeles, CANTSB LAX71DUQ40Accident · Minor injuriesClosedChampion 7GCAA · Lebec, CANTSB CHI71FDJ24Accident · Minor injuriesClosedCessna 195 · Franklin, WINTSB MIA71FKA07Accident · Serious injuriesClosedBeech 95-C55 · Mayaguez, PRNTSB LAX71AL025Accident · 1 fatalClosedBellanca 14-133 · San Fernando, CANTSB FTW71FRA26Accident · No injuriesClosedCessna 140A · Port Oconner, TXNTSB MKC71DCG31Accident · No injuriesClosedPiper PA-28R · Harrisonville, MONTSB MKC71FCG30Accident · Serious injuriesClosedBeech V35A · Kansas City, KSNTSB MIA71FKT16Accident · Minor injuriesClosedPiper PA-18 · Davie, FLNTSB ANC71DAG50Accident · Minor injuriesClosedCessna 180 · Pilot Point, AKNTSB OAK71DVD15Accident · Minor injuriesClosedAero Comdr 560-E · Ukiah, CANTSB OAK71AP023Accident · 2 fatalClosedPiper PA-30 · Mcknlyville, CANTSB MIA71OM041Accident · 1 fatalClosedPiper PA-28 · Enriquilo, DRNTSB MKC71FDM34Accident · No injuriesClosedCessna 172L · Minneapolis, MNNTSB OAK71AP022Accident · Minor injuriesClosedBeech C-45H · San Bruno, CANTSB SEA71AS024Accident · 4 fatalClosedMooney M20C · Seattle, WANTSB NYC71DHM08Accident · No injuriesClosedCessna 180 · Morganville, NJNTSB LAX71FUQ31Accident · Serious injuriesClosedCessna 150 · Valencia, CANTSB MIA71FLD31Accident · Serious injuriesClosedCessna 172 · Seminole, FLNTSB IAD71FIG18Accident · Serious injuriesClosedPiper PA-28R · Martinsburg, WVNTSB FTW71DQG42Accident · No injuriesClosedCessna 210 · Midland, TXNTSB NYC71FGM20Accident · No injuriesClosedPiper PA-28 · Jeannette, PANTSB OAK71AP021Accident · No injuriesClosedPiper PA-32 · San Francisco, CANTSB NYC71DHD29Accident · Minor injuriesClosedPiper PA-28 · Philadelphia, PANTSB MIA71AM037Accident · 1 fatalClosedPiper PA-18S · Demopolis, ALNTSB FTW71FRD23Accident · No injuriesClosedCessna 140 · Westwego, LANTSB OAK71DVG33Accident · No injuriesClosedPiper PA-28 · Vacaville, CANTSB NYC71FFD17Accident · No injuriesClosedPiper PA-28 · Norwood, MANTSB NYC71DHA19Accident · Minor injuriesClosedPiper PA-28 · Buckingham, PANTSB NYC71DFA24Accident · No injuriesClosedLuscombe 8A · Plattsburgh, NYNTSB MKC71FCD30Accident · No injuriesClosedPiper PA-28 · Earlham, IANTSB MIA71DLA15Accident · No injuriesClosedLuscombe 8A · Gainesville, FL