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 FTW78FPA35Accident · No injuriesClosedPiper PA-28 · Mc Kinney, TXNTSB FTW78DRG68Accident · No injuriesClosedCessna T210 · Burnet, TXNTSB CHI78DEP60Accident · No injuriesClosedCessna 150K · Kenosha, WINTSB MIA78DKJ76Accident · No injuriesClosedPiper PA-28 · Panama City, FLNTSB NYC78FGM44Accident · Serious injuriesClosedCessna 337 · Cutty, PANTSB FTW78FPD28Accident · No injuriesClosedPiper PA-22 · Ft Worth, TXNTSB SEA79FYM48Accident · Serious injuriesClosedHughes 369D · Cascadia, ORNTSB UNK78X0131Accident · Minor injuriesClosedPiper PA-32 · Congotown, Burkina FasoNTSB SEA78DYE35Accident · No injuriesClosedLet-Np-K L-13 · Issaquah, WANTSB FTW78FPA33Accident · Minor injuriesClosedPiper PA-18 · Caddo Mills, TXNTSB FTW78FA068Accident · Serious injuriesClosedSwearingen SA226 · Austin, TXNTSB FTW78DRG70Accident · No injuriesClosedSchweizer SGS-2 · Georgetown, TXNTSB CHI78FA059Accident · 2 fatalClosedMooney M20C · Valparaiso, INNTSB NYC78DFJ35Accident · Minor injuriesClosedMcdonald II · Mayville, NYNTSB DEN78FTE86Accident · No injuriesClosedBeech B60 · Alamosa, CONTSB DEN78FQA49Accident · No injuriesClosedCessna 206 · Roswell, NMNTSB OAK78DA042Accident · No injuriesClosedPiper PA-31 · Kneeland, CANTSB LAX78FVM39Accident · Serious injuriesClosedM Larson 1 · Sn Luis Obspo, CANTSB MIA78FKT68Accident · Serious injuriesClosedCessna 150 · Pahokee, FLNTSB MIA78DA112Accident · 1 fatalClosedSchemp Nimbus · Mt Groghan, SCNTSB CHI78FEC46Accident · Minor injuriesClosedCessna 150M · Westland, MINTSB SEA78FA052Accident · No injuriesClosedBell 47G3B1 · Snoqualmie Fls, WANTSB NYC78FA076Accident · Minor injuriesClosedPiper PA-31 · East Hampton, NYNTSB MKC78FCQ36Accident · 1 fatalClosedVari-Eze · Liberal, KSNTSB MIA78FKG70Accident · No injuriesClosedCessna 150 · Savannah, GANTSB LAX78FA064Accident · 2 fatalClosedHughes 269C · Phoenix, AZNTSB LAX78FUQ41Accident · Serious injuriesClosedCessna 150A · Pacoima, CANTSB DEN78FTE82Accident · No injuriesClosedCessna 172 · Aurora, CONTSB CHI78FEV48Accident · Minor injuriesClosedCessna U206F · Yates City, ILNTSB CHI78FA052Accident · 2 fatalClosedPiper PA-22 · East Moline, ILNTSB SEA78FYM47Accident · Serious injuriesClosedCessna 180H · Enterprise, ORNTSB MKC78DCG58Accident · Minor injuriesClosedSchweizer 1-34 · Grain Valley, MONTSB MKC78DER83Accident · No injuriesClosedCessna 180B · Eveleth, MNNTSB FTW78FPJ35Accident · Serious injuriesClosedCessna 150 · Lawton, OKNTSB DEN78FTE83Accident · Serious injuriesClosedCessna 401A · Aspen, CONTSB MKC78FA058Accident · 1 fatalClosedCessna 120 · Kimball, NENTSB IAD78FA088Accident · 3 fatalClosedPiper PA-34 · Chesterfield, VANTSB NYC79FA075Accident · 1 fatalClosedCessna 310P · Sussex, NJNTSB MKC78FCA47Accident · Minor injuriesClosedCessna 172N · Pevely, MONTSB LAX78IA065Incident · No injuriesClosedMooney M20J · Tucson, AZNTSB OAK78FVD50Accident · No injuriesClosedCessna 140A · Concord, CANTSB NYC78DHA31Accident · Minor injuriesClosedSchweizer 233 · Hilltown, PANTSB LAX78FUQ39Accident · No injuriesClosedPitts S-1S · Santa Paula, CANTSB CHI78FEX28Accident · 2 fatalClosedPiper PA-28 · Mitchell, INNTSB CHI78FEP52Accident · 2 fatalClosedThorp T-18 · Oshkosh, WINTSB NYC78FNC42Accident · Minor injuriesClosedCessna 182D · Hollis, NHNTSB FTW78DPG70Accident · No injuriesClosedCessna 150 · Lakeview, ARNTSB DEN78FTM31Accident · Minor injuriesClosedSchweizer SGS2 · Heber, UTNTSB UNK78X0129Accident · 1 fatalClosedEnstrom 280C · Lester, WANTSB CHI78FEP50Accident · No injuriesClosedCessna 172 · Tony, WI