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 MIA70FKW06Accident · Serious injuriesClosedCessna 150 · Chattanooga, TNNTSB ANC70DAA09Accident · No injuriesClosedCessna 175B · Rampart, AKNTSB MKC70FCA10Accident · Minor injuriesClosedCessna 120 · Williamsburg, MONTSB IAD70FIA14Accident · Serious injuriesClosedPiper PA-28 · Baileys X-Road, VANTSB FTW70FPD09Accident · No injuriesClosedPiper PA-22 · Mansfield, TXNTSB OAK70FVG13Accident · Serious injuriesClosedSchleicher K8B · Fairfield, CANTSB DCA70AZ008Accident · 6 fatalClosedLear Jet 23A · Pellston, MINTSB MIA70FLG18Accident · Serious injuriesClosedCessna 182B · Charleston, SCNTSB MIA70DKJ32Accident · No injuriesClosedPiper PA-22 · Tuskegee, ALNTSB MIA70DKG29Accident · No injuriesClosedPiper PA-23 · St.Marys, GANTSB OAK71DVG04Accident · No injuriesClosedSchweizer 1-26A · Old Station, CANTSB CHI70FBQ15Accident · No injuriesClosedBoeing D75N1 · Wilsonville, ILNTSB ANC70AA078Accident · No injuriesClosedLockheed 1049H · Barrow, AKNTSB LAX70FUG30Accident · No injuriesClosedMorrisey 2150 · Rubidoux, CANTSB LAX70FUA25Accident · Minor injuriesClosedBellanca 17-30 · Long Beach, CANTSB CHI70DBQ13Accident · No injuriesClosedCessna 140 · El Paso, ILNTSB NYC70DFD12Accident · No injuriesClosedPiper PA-32 · Smithfield, RINTSB DCA70AZ007Accident · 23 fatalClosedDouglas DC-9 · St.Croix, VINTSB CHI70FBM14Accident · Minor injuriesClosedMooney M20A · Fort Waybe, INNTSB SEA70FWG12Accident · No injuriesClosedCessna 150G · Wenatchee, WANTSB NYC70FFM12Accident · Minor injuriesClosedCessna 310N · Westfield, MANTSB ANC70AA075Accident · No injuriesClosedCessna 180 · Kobuk, AKNTSB IAD70FIA13Accident · Serious injuriesClosedPiper PA-23 · Clinton, MDNTSB MKC70FCG24Accident · No injuriesClosedPiper PA-28 · Olathe, KSNTSB MKC70FCA09Accident · No injuriesClosedCessna 180 · Fenton, MONTSB FTW70FRJ07Accident · 1 fatalClosedPiper PA-25 · St.Joseph, LANTSB MIA70AM087Accident · 2 fatalClosedCessna P206C · St.Augustine, FLNTSB NYC71DHM15Accident · No injuriesClosedSchweizer 1-23 · Wurtsboro, NYNTSB LAX70IL068Incident · No injuriesClosedCessna 150G · Pacoima, CANTSB LAX70FUQ25Accident · No injuriesClosedCessna 150 · Goleta, CANTSB IAD70AI059Accident · 2 fatalClosedPiper PA-28 · Frederick, MDNTSB MKC70DDM23Accident · No injuriesClosedPiper J3C · Jackson, MNNTSB LAX70AL067Accident · No injuriesClosedPiper PA-28R · Ramona, CANTSB FTW70AF067Accident · 6 fatalClosedBeech D50C · Austin, TXNTSB MKC70FCJ17Accident · Serious injuriesClosedMooney M20C · Crawford, NENTSB LAX70DVA12Accident · No injuriesClosedSchweizer SGS123 · Mckittrick, CANTSB NYC70FFD10Accident · Minor injuriesClosedMooney M20E · Marlboro, MANTSB FTW70DPJ12Accident · No injuriesClosedPiper PA-28 · Granite, OKNTSB IAD70DIA11Accident · No injuriesClosedSchweizer 2-33 · Warrenton, VANTSB ANC70DAA07Accident · Minor injuriesClosedPiper PA-22 · Bettles, AKNTSB MIA70FLA19Accident · Serious injuriesClosedPiper PA-31 · Tallahassee, FLNTSB OAK70FVA09Accident · No injuriesClosedPiper PA-23 · Fresno, CANTSB NYC70DHG04Accident · No injuriesClosedCessna 150 · Sayre, PANTSB NYC70DHD16Accident · No injuriesClosedPiper PA-28 · Moorestown, NJNTSB NYC70DFM09Accident · No injuriesClosedPiper PA-28 · East Hampton, CTNTSB OAK70DVG27Accident · Minor injuriesClosedAeronca 7AC · Sloughhouse, CANTSB MKC70AK055Accident · Minor injuriesClosedAeronca 7AC · So.St.Paul, MNNTSB FTW70FRG33Accident · No injuriesClosedMorrisey 2150 · San Antonio, TXNTSB MKC70DDM19Accident · Minor injuriesClosedCessna 150 · Lake Elmo, MNNTSB LAX70AL063Accident · Serious injuriesClosedCessna 150F · Tucson, AZ