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 FTW70AF049Accident · No injuriesClosedPiper PA-23 · Tulsa, OKNTSB DEN70FXT02Accident · Minor injuriesClosedAero Comdr 680-F · Ogden, UTNTSB CHI70FGA04Accident · No injuriesClosedPiper PA-28 · Piqua, OHNTSB DEN70AD046Accident · 8 fatalClosedAero Comdr 680V · Aspen, CONTSB CHI70FBJ04Accident · Minor injuriesClosedPiper PA-23 · Conway, MINTSB MKC70FDM03Accident · No injuriesClosedDehavilland DHC-2 · Ely, MNNTSB CHI70FBG04Accident · No injuriesClosedPiper PA-28 · Ann Arbor, MINTSB MKC70DCD06Accident · No injuriesClosedPiper PA-28 · Fairfield, IANTSB CHI70DDJ05Accident · No injuriesClosedCessna 150 · Waukesha, WINTSB MIA70FKQ01Accident · No injuriesClosedCessna 150J · Southaven, MSNTSB MIA70FKG02Accident · Serious injuriesClosedBeech 95-A55 · Kennesaw, GANTSB CHI70FBA02Accident · No injuriesClosedPiper PA-22 · Mooresville, INNTSB MKC70DDQ01Accident · No injuriesClosedCessna 150 · Miller, SDNTSB CHI70FGD02Accident · Serious injuriesClosedCessna 310K · Mentor, OHNTSB MIA70AM055Accident · Serious injuriesClosedPiper PA-23 · Bay Minette, ALNTSB FTW70AF046Accident · No injuriesClosedDouglas DC-9 · Harlingen, TXNTSB MKC70DCD01Accident · No injuriesClosedCessna 177 · Osage, IANTSB LAX70AL040Accident · No injuriesClosedGrumman G-21A · Avalon, CANTSB MKC70DCQ02Accident · No injuriesClosedCessna 172K · Salina, KSNTSB DEN70FXT01Accident · No injuriesClosedCessna 182 · Spanish Fork, UTNTSB MKC70FCQ01Accident · Serious injuriesClosedBeech 95-B55 · Hutchinson, KSNTSB ANC70AA054Accident · No injuriesClosedCessna 180 · Bethel, AKNTSB NYC70DHD02Accident · No injuriesClosedCessna 177 · Vineland, NJNTSB CHI70FGA02Accident · No injuriesClosedPiper PA-24 · Erlanger, KYNTSB CHI70AC043Accident · 1 fatalClosedCessna 150H · Collinsville, ILNTSB LAX70FUQ02Accident · Serious injuriesClosedCessna 140 · Pacoima, CANTSB FTW70FPD02Accident · Serious injuriesClosedCessna 150H · Fort Worth, TXNTSB NYC70DFA02Accident · No injuriesClosedCessna 150 · Plattsburgh, NYNTSB MIA70AM053Accident · 2 fatalClosedCessna 337B · Cedar Key, FLNTSB LAX70FUD01Accident · Minor injuriesClosedMooney M20E · Los Angeles, CANTSB MKC70FDD03Accident · No injuriesClosedChampion 7CCM · Verona, NDNTSB OAK70O0002Accident · Serious injuriesClosedPilatus PC-6 · Saigon, VMNTSB MIA70A0051Accident · 4 fatalClosedBeech V35A · Tampa, FLNTSB IAD70D0121Accident · No injuriesClosedCessna 172 · Monroe, NCNTSB ANC70D0087Accident · No injuriesClosedPiper PA-18 · Glennallen, AKNTSB MKC70F0316Accident · Minor injuriesClosedCessna 182H · Kansas City, KSNTSB MIA70D0264Accident · No injuriesClosedCessna 150 · St Elmo, ALNTSB LAX70F0238Accident · Minor injuriesClosedPiper PA-28 · Rialto, CANTSB FTW70F0339Accident · Minor injuriesClosedCessna 177 · Berwick, LANTSB CHI70F0377Accident · No injuriesClosedPiper J3C-65 · Paw Paw, MINTSB FTW70F0328Accident · No injuriesClosedCessna 210 · Lufkin, TXNTSB CHI70F0395Accident · Minor injuriesClosedBeech E33 · Milan, ILNTSB SEA70D0127Accident · Minor injuriesClosedPiper PA-18 · Jordan Vally, ORNTSB MIA70A0049Accident · 1 fatalClosedPiper PA-30 · Crossville, TNNTSB NYC70F0245Accident · Minor injuriesClosedPiper PA-28 · East Hanover, NJNTSB MKC70A0035Accident · 1 fatalClosedBeech 65-80 · Republic, MONTSB FTW70F0344Accident · Minor injuriesClosedBeech 95-B55 · Addison, TXNTSB MKC70D0293Accident · No injuriesClosedCessna 170B · Baldwin City, KSNTSB IAD70D0125Accident · No injuriesClosedCessna 195 · Mt Jackson, VANTSB NYC70A0064Accident · 1 fatalClosedCessna 150H · Woodbury, CT