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 MIA72DKT15Accident · No injuriesClosedSiai-Marche S.205 · W Palm Beach, FLNTSB LAX72DUJ41Accident · Minor injuriesClosedCessna 310 · Marana, AZNTSB FTW72DPD10Accident · No injuriesClosedCessna 150 · Graford, TXNTSB CHI72FEK03Accident · No injuriesClosedCessna 180 · Paulding, OHNTSB CHI72AC020Accident · 1 fatalClosedStinson 108-3 · Fowlerville, MINTSB NYC72FNE10Accident · Minor injuriesClosedPiper PA-28 · Plainville, CTNTSB MKC72DCQ27Accident · No injuriesClosedMaule M-4 · Newton, KSNTSB MIA72FKQ18Accident · No injuriesClosedGrumman G-164A · Oakland, MSNTSB DCA72AZ003Accident · 111 fatalClosedBoeing 727 · Juneau, AKNTSB CHI72FEM19Accident · Serious injuriesClosedSchweizer 1-26 · Ionia, MINTSB CHI72DEM25Accident · No injuriesClosedPiper J-3 · Fremont, MINTSB ANC72DAG50Accident · Minor injuriesClosedPiper J3C-65 · Tyonek, AKNTSB NYC72FHM08Accident · Serious injuriesClosedBensen B8M · New Shrewsbury, NJNTSB FTW72DPD08Accident · No injuriesClosedPiper PA-22 · Ft.Worth, TXNTSB CHI72DEM17Accident · No injuriesClosedCessna 150H · Bruce Crosng, MINTSB SEA72IS008Incident · No injuriesClosedBoeing 747 · Seattle, WANTSB DEN72FQA18Accident · Minor injuriesClosedCessna 210 · Ruidoso, NMNTSB ANC72FAG54Accident · Serious injuriesClosedCessna 180 · Tyonek, AKNTSB DEN72DTE26Accident · No injuriesClosedCessna 150 · Hillrose, CONTSB NYC72AN031Accident · 2 fatalClosedBeech F33A · Andover, NJNTSB LAX72FUG08Accident · Minor injuriesClosedAmer Avco AA1 · Rialto, CANTSB FTW72DPM06Accident · No injuriesClosedCessna 150 · Skiatook, OKNTSB CHI72FEM24Accident · No injuriesClosedPiper J3 · Otsego, MINTSB SEA72DYC19Accident · No injuriesClosedPiper PA-12 · Kimberley, ORNTSB FTW72FPJ10Accident · Minor injuriesClosedCessna 172H · Bethany, OKNTSB SEA72FYI08Accident · Serious injuriesClosedCessna 150G · Paisley, ORNTSB NYC72FKM03Accident · Serious injuriesClosedChampion 7KCAB · Morganton, NCNTSB LAX72FUM08Accident · Serious injuriesClosedCessna 172K · Salton City, CANTSB ANC72AA013Accident · 2 fatalClosedPiper PA-18 · Kenai, AKNTSB NYC72DHA11Accident · No injuriesClosedPiper PA-28 · Prospectville, PANTSB MIA72FKT11Accident · Serious injuriesClosedPiper J3C-65 · Delray Beach, FLNTSB ANC72AA012Accident · No injuriesClosedCessna 185 · Seldovia, AKNTSB NYC72FNA09Accident · Minor injuriesClosedCessna 150K · Mansfield, MANTSB MIA72AM016Accident · 3 fatalClosedCessna 210A · Madison, ALNTSB LAX72FUJ29Accident · 1 fatalClosedCessna 172 · Stanfield, AZNTSB CHI72FEE18Accident · Minor injuriesClosedPiper PA-28 · Grayslake, ILNTSB SEA72DTI05Accident · No injuriesClosedDehavilland DH 104 · Chester, MTNTSB NYC72DFA08Accident · No injuriesClosedBell 47-G · Malone, NYNTSB MKC72FCG14Accident · Serious injuriesClosedCessna 210F · Bolivar, MONTSB MIA72FKT09Accident · Serious injuriesClosedChampion 7FC · Lantana, FLNTSB ANC72FAG27Accident · Minor injuriesClosedPiper PA-28 · Soldotna, AKNTSB NYC72FID07Accident · No injuriesClosedCessna 150 · Ft Eustis, VANTSB LAX72FVA16Accident · No injuriesClosedCessna 177 · Bakersfield, CANTSB SEA72DYE15Accident · Minor injuriesClosedRyan ST-3KR · Olympia, WANTSB SEA72DYE11Accident · No injuriesClosedCessna 150 · Bellingham, WANTSB SEA72DYA09Accident · No injuriesClosedLuscombe 8A · Jordan Vally, ORNTSB OAK72FVG18Accident · Serious injuriesClosedAeronca 11AC · Sacramento, CANTSB FTW72AF010Accident · 4 fatalClosedAero Comdr 100 · Georgetown, TXNTSB CHI72FET06Accident · Minor injuriesClosedBell 47G-2 · Laporte, INNTSB CHI72FEV13Accident · No injuriesClosedCessna 150 · Manito, IL