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 ANC81DAG81Accident · No injuriesClosedCessna U206F · Dikeman, AKNTSB CHI81FA101Accident · 1 fatalClosedCessna 172 · Faithorn, MINTSB CHI81FA100Accident · 1 fatalClosedSchweizer SGS232 · Waynesville, OHNTSB MKC81FCJ33Accident · Serious injuriesClosedRutan Vreze · Lincoln, NENTSB MKC81DCG57Accident · No injuriesClosedMooney M20C · Brookfield, MONTSB NYC81FNE30Accident · No injuriesClosedPiper PA-28 · Northampton, MANTSB LAX81FUK01Accident · Minor injuriesClosedAero Comdr 500A · Flagstaff, AZNTSB DEN81DTK23Accident · Minor injuriesClosedHughes 269C · Wilmot, SDNTSB CHI81FET13Accident · Minor injuriesClosedCessna 172E · Laporte, INNTSB FTW81IA141Incident · No injuriesClosedBell 206L-1 · Brazoria, TXNTSB CHI81FEM43Accident · No injuriesClosedAeronca 65-TC · Plainwell, MINTSB ATL81FKQ28Accident · No injuriesClosedCessna 182 · Batesville, MSNTSB NYC81FNA27Accident · Serious injuriesClosedGrum Amer AA-1B · Tewksbury, MANTSB CHI81DER69Accident · No injuriesClosedBeech B19 · Hibbing, MNNTSB SEA81DYA26Accident · No injuriesClosedCessna 172F · Arco, IDNTSB ANC81FA108Accident · 4 fatalClosedCessna 340A · Ketchikan, AKNTSB FTW81FA140Accident · 1 fatalClosedCessna T210R · Lake Jackson, TXNTSB ANC81DA111Accident · No injuriesClosedCessna 207A · Golovin, AKNTSB ATL81FKG46Accident · Minor injuriesClosedCessna 310 · Abbeville, GANTSB ANC81DAG71Accident · No injuriesClosedPiper PA-28 · Seldovia, AKNTSB MIA81IA110Incident · No injuriesClosedBeech 3NM · Jacksonville, FLNTSB LAX81IA123Incident · No injuriesClosedPiper PA-31T · Joshua Tree, CANTSB CHI81FEK29Accident · Serious injuriesClosedGlobe GC-1 · Mt Vernon, OHNTSB SEA81DYM40Accident · No injuriesClosedCessna 182Q · Enterprise, ORNTSB MKC81FA052Accident · Serious injuriesClosedPiper PA-38 · Clinton, MONTSB FTW81FA137Accident · 2 fatalClosedBeech K35 · Albuquerque, NMNTSB SEA81FYK17Accident · Serious injuriesClosedPiper PA-12 · Bend, ORNTSB ANC81DAG83Accident · Minor injuriesClosedCessna TU206G · Talkeetna, AKNTSB SEA81DYE38Accident · No injuriesClosedCessna 172A · Port Townsend, WANTSB FTW81FQA43Accident · No injuriesClosedCessna 320F · Ruidoso, NMNTSB NYC81FNE27Accident · No injuriesClosedSchweizer 1-23H · Plymouth, CTNTSB MIA81FKT90Accident · No injuriesClosedPiper PA-31 · Ft.Lauderdale, FLNTSB DEN81FTC24Accident · Minor injuriesClosedCessna 177RG · Cheyenne, WYNTSB FTW81FPM20Accident · Minor injuriesClosedCessna 150 · Atoka, OKNTSB FTW81FPJ36Accident · No injuriesClosedPiper PA-28 · Blanchard, OKNTSB LAX81FVA59Accident · No injuriesClosedBeech 58 · Fresno, CANTSB FTW81FRJ30Accident · No injuriesClosedPiper PA-32R · Monroe, LANTSB CHI81DEM10Accident · No injuriesClosedPiper PA-38 · Saginaw, MINTSB LAX81FA120Accident · Serious injuriesClosedCessna T207A · Tusayan, AZNTSB CHI81FEV33Accident · No injuriesClosedCessna 172I · Danville, ILNTSB NYC81FGM25Accident · Minor injuriesClosedBeech 23 · Irwin, PANTSB LAX81DXQ32Accident · Serious injuriesClosedGlasfugel H301 · Truckee, CANTSB LAX81AA119Accident · 1 fatalClosedPiper PA-28R · San Jose, CANTSB ANC81DAG67Accident · No injuriesClosedPiper PA-18 · Glennallen, AKNTSB SEA81FYP35Accident · No injuriesClosedNavion · Spangle, WANTSB MIA81FA105Accident · 4 fatalClosedAero Comdr 680FL · St.Croix, VINTSB ATL81DKJ32Accident · Serious injuriesClosedPiper PA-32 · Tuscaloosa, ALNTSB MIA81FKT88Accident · Minor injuriesClosedLake LA-4 · Tavernier, FLNTSB FTW81FA131Accident · Minor injuriesClosedBell 206L-1 · Mesquite, TXNTSB CHI81FA089Accident · 5 fatalClosedBalloon WKS 8-24 · Barrington, IL