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 NYC73FHD22Accident · No injuriesClosedPiper PA-30 · Moorestown, NJNTSB NYC73ANC46Accident · No injuriesClosedPiper PA-28 · Nashua, NHNTSB MKC73FCJ27Accident · Serious injuriesClosedCessna 150F · Lincoln, NENTSB ANC73DAG74Accident · No injuriesClosedPiper PA-18 · Sterling, AKNTSB CHI73AC062Accident · 2 fatalClosedPiper PA-32 · Holland, OHNTSB ANC73FAG73Accident · Minor injuriesClosedStinson 108-3 · Soldotna, AKNTSB NYC73FNE16Accident · No injuriesClosedPiper PA-28 · Ellington, CTNTSB LAX73FUG27Accident · No injuriesClosedCessna 150 · Corona, CANTSB OAK73AP019Accident · 1 fatalClosedPiper PA-28 · Hayward, CANTSB NYC73FFJ16Accident · Serious injuriesClosedPiper PA-22 · Leroy, NYNTSB NYC73AN098Accident · 4 fatalClosedCessna 320E · Avoca, PANTSB NYC73DHD21Accident · No injuriesClosedSchweizer SG233A · West Chester, PANTSB LAX73DUJ48Accident · No injuriesClosedCessna 210 · L Havasu Cy, AZNTSB MKC73DCG25Accident · No injuriesClosedPiper PA-28 · Olathe, KSNTSB LAX73FUJ43Accident · Minor injuriesClosedCessna 150L · Peoria, AZNTSB LAX73DUG29Accident · No injuriesClosedCessna 175A · Yucca Vally, CANTSB NYC73FKM21Accident · No injuriesClosedPiper PA-32 · Shelby, NCNTSB CHI73DEE39Accident · No injuriesClosedPiper PA-28 · Lansing, ILNTSB NYC73FGM15Accident · No injuriesClosedPiper PA-30 · Conemaugh, PANTSB FTW73AF036Accident · 2 fatalClosedPiper PA-28 · Prattville, ALNTSB ANC73DAG70Accident · No injuriesClosedCessna 150L · Anchorage, AKNTSB MIA73AM069Accident · 2 fatalClosedCessna 310P · Memphis, TNNTSB LAX73FUM13Accident · No injuriesClosedBeech A35 · El Cajon, CANTSB CHI73FEC20Accident · Minor injuriesClosedLuscombe 8A · Belleville, MINTSB MIA73FKA07Accident · 1 fatalClosedAmer Avco AA1 · San Juan, PRNTSB NYC73FHJ11Accident · Minor injuriesClosedCessna 172L · Deer Park, NYNTSB MKC73DCQ24Accident · No injuriesClosedCessna 210 · Manhattan, KSNTSB MIA73FLD51Accident · Minor injuriesClosedCessna 150L · St.Petersburg, FLNTSB FTW73AF033Accident · 4 fatalClosedBeech 65-80 · Kent, TXNTSB MIA73DKG55Accident · Minor injuriesClosedSidewinder Smith · Milledgeville, GANTSB FTW73FRG40Accident · No injuriesClosedCessna 150 · Rockport, TXNTSB NYC73AN090Accident · 3 fatalClosedLockheed L1329 · Saranac Lake, NYNTSB MKC73DER31Accident · No injuriesClosedPiper PA-30 · Morris, MNNTSB FTW73FRA13Accident · No injuriesClosedPiper PA-28 · Bellville, TXNTSB SEA73FYA15Accident · No injuriesClosedCessna 182P · Gooding, IDNTSB MKC73FCQ23Accident · 1 fatalClosedBeard-Parkr Mini · Benton, KSNTSB CHI73FLQ19Accident · No injuriesClosedCessna 310J · Lexington, KYNTSB CHI73FEG14Accident · Serious injuriesClosedCessna 195A · Tipp City, OHNTSB CHI73FEC19Accident · Minor injuriesClosedLash A-65 · Lakeville, MINTSB SEA73DYE23Accident · Minor injuriesClosedRyan ST-3KR · Snohomish, WANTSB NYC73FLJ15Accident · Minor injuriesClosedCessna 172 · Morrisville, NCNTSB MKC73FCG22Accident · No injuriesClosedBeech M35 · Independence, MONTSB CHI73FEA21Accident · Serious injuriesClosedBellanca 17-30A · Marion, INNTSB MKC73FCA13Accident · Serious injuriesClosedCessna 182H · Chesterfield, MONTSB CHI73AC059Accident · 2 fatalClosedBeech H18S · Bloominton, ILNTSB NYC73AN087Accident · No injuriesClosedPiper PA-23 · Allentown, PANTSB NYC73AN086Accident · 2 fatalClosedPiper PA-23 · New Boston, MINTSB MKC73AK041Accident · 1 fatalClosedCessna 172K · Dickinson, NDNTSB FTW73AF030Accident · 1 fatalClosedCessna 210J · Bedford, TXNTSB LAX73AL027Accident · 1 fatalClosedAmer Avco AA-1A · Pacoima, CA