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 MIA80FLD50Accident · Serious injuriesClosedCessna 152 · Orlando, FLNTSB LAX80FUQ13Accident · No injuriesClosedSchleicher ASW-12 · Llano, CANTSB LAX80DVA34Accident · No injuriesClosedAero Comdr S2R · Lemoore, CANTSB MIA80FKT21Accident · Minor injuriesClosedBeech G35 · Pompano, FLNTSB FTW80FA063Accident · 2 fatalClosedPiper PA-24 · Texarkana, TXNTSB DEN80DTM12Accident · No injuriesClosedCessna 182 · Cedar City, UTNTSB NYC80FA034Accident · No injuriesClosedBeech 95-C55 · Hartford, CTNTSB ANC80FAD05Accident · No injuriesClosedMaule M-5 · Yakutat, AKNTSB DEN80FTE39Accident · Minor injuriesClosedBell 206B · Ft Collins, CONTSB SEA80FYP15Accident · No injuriesClosedPiper PA-28 · Spokane, WANTSB FTW80FRG36Accident · Minor injuriesClosedPiper PA-28 · Victoria, TXNTSB FTW80FPG20Accident · 1 fatalClosedBede 5 · Carlisle, ARNTSB NYC80FFA10Accident · No injuriesClosedPiper PA-28 · Durhamville, NYNTSB IAD80FLQ16Accident · Minor injuriesClosedBellanca 7ECA · Lexington, KYNTSB IAD80DKM13Accident · No injuriesClosedPiper PA-28 · Mayodan, NCNTSB FTW80FRA22Accident · No injuriesClosedPiper PA-32R · Houston, TXNTSB MIA80FKQ06Accident · Minor injuriesClosedCessna 337 · Madison, MSNTSB DEN80FA031Accident · 2 fatalClosedCessna 441 · Butte, MTNTSB MKC80DER32Accident · No injuriesClosedBeech C24R · Blaine, MNNTSB IAD80FKW11Accident · No injuriesClosedCessna 152 · Murfreesboro, TNNTSB CHI80DEX06Accident · No injuriesClosedPiper PA-31 · W Lafayette, INNTSB FTW80FRG33Accident · No injuriesClosedBeech A-36 · Los Fresnos, TXNTSB IAD80FA033Accident · 1 fatalClosedMooney M20C · Beckley, WVNTSB LAX80DVG20Accident · Serious injuriesClosedCessna 152 · Alta Sierra, CANTSB NYC80FNA10Accident · Minor injuriesClosedBell 47G-3B · Plymouth, MANTSB LAX80DXQ21Accident · No injuriesClosedPiper PA-32 · Mammoth Lakes, CANTSB LAX80DVA26Accident · No injuriesClosedPiper PA-28 · Tulare, CANTSB IAD80FA031Accident · 1 fatalClosedPiper PA-30 · Charlotte, NCNTSB FTW80FA056Accident · 2 fatalClosedCessna 421C · Decatur, ARNTSB MIA80FA049Accident · 2 fatalClosedCessna U206 · York, ALNTSB NYC80FFA12Accident · No injuriesClosedPiper PA-28 · Hudson, NYNTSB IAD80DKM11Accident · No injuriesClosedBalloon WKS AX-7 · East Bend, NCNTSB FTW80FPG19Accident · No injuriesClosedCessna 182 · Decatur, ARNTSB CHI80DEM20Accident · No injuriesClosedPiper PA-28 · Harrison, MINTSB LAX80FA068Accident · 2 fatalClosedPiper PA-28 · Chester, CANTSB DEN80FA028Accident · 1 fatalClosedCessna 182RG · Ordway, CONTSB NYC80FA026Accident · 2 fatalClosedBeech 90 · Flushing, NYNTSB NYC80FHJ12Accident · Serious injuriesClosedPiper PA-28 · Amityville, NYNTSB NYC80FHD09Accident · No injuriesClosedCessna 172 · Cross Keys, NJNTSB IAD80DIG06Accident · No injuriesClosedSchweizer 1-26C · Charlestown, WVNTSB FTW80FPJ09Accident · Serious injuriesClosedPieten Pol AIR CP · Moore, OKNTSB FTW80DPD17Accident · No injuriesClosedPiper PA-38 · N.Richlnd Hill, TXNTSB LAX80FVW12Accident · Minor injuriesClosedBellanca 17-30 · Lathrop Wells, NVNTSB FTW80DRA21Accident · No injuriesClosedGrumman G-164B · Nalvin, TXNTSB MKC80FER26Accident · No injuriesClosedPiper PA-32 · Sauk Centre, MNNTSB IAD80FA030Accident · 4 fatalClosedPiper PA-34 · Pine Mountain, GANTSB FTW80DPJ08Accident · No injuriesClosedCessna 170 · Gage, OKNTSB MIA80FA042Accident · 5 fatalClosedPiper PA-32R · Ocala, FLNTSB FTW80DQG10Accident · Minor injuriesClosedBeech F33A · Blackwell, TXNTSB FTW80DA053Accident · Serious injuriesClosedBeech 58 · Houston, TX