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 LAX71DUJ01Accident · Serious injuriesClosedNavion A · Willcox, AZNTSB FTW71FPJ44Accident · No injuriesClosedCessna 172G · Oklahoma Cty, OKNTSB LAX71FUQ93Accident · Serious injuriesClosedCessna 182 · Sta Barbara, CANTSB OAK71FXQ45Accident · Minor injuriesClosedCessna 182 · Reno, NVNTSB NYC71FNA56Accident · No injuriesClosedPiper PA-28 · Norwood, MANTSB DEN71FQD25Accident · Serious injuriesClosedPiper PA-32 · Chamberino, NMNTSB CHI71IC089Incident · No injuriesClosedLuscombe 8E · Ann Arbor, MINTSB LAX71FUA67Accident · Minor injuriesClosedLark 95 · Sj Capstrno, CANTSB OAK71FJA18Accident · Minor injuriesClosedSchweizer TG-3A · Haleiwa, HINTSB MKC71DER76Accident · No injuriesClosedSchweizer 1-26 · Hayfield, MNNTSB IAD71FLJ27Accident · Minor injuriesClosedCessna 172K · Southport, NCNTSB IAD71DIA22Accident · No injuriesClosedCessna 170B · Cobb Island, MDNTSB FTW71DRJ37Accident · Minor injuriesClosedCessna 180 · Ringgold, LANTSB DEN71FQA58Accident · Serious injuriesClosedMooney M20E · Albuquerque, NMNTSB OAK71FVA83Accident · No injuriesClosedCessna 150L · Fresno, CANTSB NYC71FNC30Accident · No injuriesClosedSchweizer 2-33 · Warren, VTNTSB LAX71FUG91Accident · Minor injuriesClosedCessna 172K · Bg Bear Cty, CANTSB FTW71AF083Accident · 2 fatalClosedPiper PA-28 · Beckville, TXNTSB OAK71DVG82Accident · Minor injuriesClosedBeech 19A · Pope Valley, CANTSB MIA71DKJ60Accident · No injuriesClosedCessna 150 · Guin, ALNTSB SEA71FYC44Accident · No injuriesClosedBeech V35B · Vancouver, WANTSB NYC71FHA52Accident · Minor injuriesClosedCessna 172 · Fleetville, PANTSB MIA71AM111Accident · 2 fatalClosedCessna A150L · Tallahassee, FLNTSB FTW71FPA34Accident · Minor injuriesClosedCessna 150B · Addison, TXNTSB SEA71FTI36Accident · Minor injuriesClosedCallair A-5 · Havre, MTNTSB DCA71AZ009Accident · 28 fatalClosedConvair 580 · New Haven, CTNTSB NYC71FNA51Accident · No injuriesClosedPiper PA-28 · Oak Bluffs, MANTSB MKC71FCG73Accident · No injuriesClosedCessna 180 · Smithville, MONTSB CHI71DEI57Accident · No injuriesClosedPiper PA-16 · Dorset, OHNTSB CHI71AC086Accident · 2 fatalClosedCessna 182 · Lafayette, INNTSB MKC71DER70Accident · No injuriesClosedCessna 170B · Lakeville, MNNTSB MIA71FKG89Accident · No injuriesClosedCessna 150J · Lithonia, GANTSB MKC71FCJ67Accident · Minor injuriesClosedCessna 182A · Grand Island, NENTSB MIA71DLA49Accident · No injuriesClosedPiper PA-28 · Fernandna Bch, FLNTSB FTW71FPA33Accident · No injuriesClosedBellanca 14-19 · Addison, TXNTSB DEN71DTE13Accident · Minor injuriesClosedPiper PA-12 · Louviers, CONTSB CHI71DEE83Accident · No injuriesClosedPiper PA-28 · Roselle, ILNTSB NYC71FGM50Accident · Serious injuriesClosedCessna 150F · Valencia, PANTSB CHI71FEM87Accident · No injuriesClosedPiper PA-28 · Riverdale, MINTSB MIA71DLG29Accident · No injuriesClosedPiper PA-16 · Isle Of Palms, SCNTSB NYC71DHA50Accident · No injuriesClosedWolf Hirth L0-150 · Matamoras, PANTSB NYC71DHD51Accident · No injuriesClosedCessna 150 · Atlantic City, NJNTSB MIA71RM105Accident · 6 fatalClosedPiper PA-23 · Cat Islnd, Burkina FasoNTSB CHI71FCA06Accident · Minor injuriesClosedCessna 172I · Bethalto, ILNTSB OAK71DVG79Accident · No injuriesClosedSchweizer 2-22E · Auburn, CANTSB NYC71AN114Accident · 1 fatalClosedPiper PA-28 · Reading, PANTSB FTW71FPD57Accident · No injuriesClosedCessna 182 · Stephenville, TXNTSB CHI47DEI59Accident · No injuriesClosedCessna 150J · New Phil, OHNTSB MIA71AM100Accident · Minor injuriesClosedGrumman G-21A · Charlotte Amal, VINTSB MIA71FLD65Accident · Serious injuriesClosedBeech 35 · Windermere, FL