NTSB defining events

NTSB records the sequence of events in each investigation and marks the one that best describes it: the defining event. 30,760 cases since 2008 have one, from 92 kinds of event.

Most common

Query with SQL
duckdb -csv -c "SELECT e.\"tier2Number\" AS event, max(e.\"eventTier2Name\") AS name,
    count(DISTINCT e.case_mkey) FILTER (WHERE e.\"isDefiningEvent\") AS defining,
    count(DISTINCT e.case_mkey) AS in_sequence,
    count(DISTINCT e.case_mkey) FILTER (WHERE e.\"isDefiningEvent\" AND c.\"highestInjuryLevel\" = 'Fatal') AS fatal_defining
  FROM 'https://openairdocs.org/data/latest/ntsb_events.parquet' e JOIN 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' c ON c.\"mKey\" = e.case_mkey
  WHERE e.\"tier2Number\" GLOB '[0-9][0-9][0-9]' AND e.\"eventTier2Name\" IS NOT NULL AND e.case_mkey IN (SELECT case_mkey FROM 'https://openairdocs.org/data/latest/ntsb_events.parquet' WHERE \"isDefiningEvent\")
  GROUP BY 1
  ORDER BY defining DESC, in_sequence DESC"

Prints the counts as CSV. It reads the release’s Parquet files over HTTPS, so there’s nothing to download first. Install DuckDB to run it.

Over the years

Cases per year for the six most common defining events. Defining events are coded with the final report, so the latest years are incomplete.

Loss of control on ground
20082026
Cases with Loss of control on ground as the defining event, per year: 3,834 cases
2008224
2009226
2010188
2011203
2012236
2013180
2014171
2015185
2016220
2017231
2018240
2019230
2020204
2021185
2022202
2023210
2024199
2025157
2026143

3,834 cases

Loss of control in flight
20082026
Cases with Loss of control in flight as the defining event, per year: 3,832 cases
2008253
2009231
2010195
2011247
2012241
2013213
2014246
2015216
2016217
2017215
2018194
2019231
2020198
2021188
2022195
2023171
2024141
2025155
202685

3,832 cases

Loss of engine power (total)
20082026
Cases with Loss of engine power (total) as the defining event, per year: 2,821 cases
2008180
2009167
2010175
2011174
2012166
2013167
2014152
2015157
2016142
2017148
2018137
2019141
202094
2021183
2022111
2023108
2024118
2025179
2026122

2,821 cases

Unknown or undetermined
20082026
Cases with Unknown or undetermined as the defining event, per year: 1,515 cases
200812
200920
201033
201134
201236
201332
201456
201572
201692
201778
201894
201967
202073
202189
2022105
2023134
2024117
2025118
2026253

1,515 cases

Loss of engine power (partial)
20082026
Cases with Loss of engine power (partial) as the defining event, per year: 1,417 cases
200875
200975
201078
201188
201295
201362
201488
201589
201682
201766
201877
201981
202058
202178
202253
202364
202470
202581
202657

1,417 cases

Hard landing
20082026
Cases with Hard landing as the defining event, per year: 1,245 cases
2008111
200985
201081
201179
201278
201372
201461
201574
201666
201753
201844
201961
202052
202156
202269
202360
202455
202543
202645

1,245 cases

Query with SQL
duckdb -csv -c "WITH top AS (
    SELECT \"tier2Number\" AS event FROM 'https://openairdocs.org/data/latest/ntsb_events.parquet'
    WHERE \"isDefiningEvent\" AND \"tier2Number\" GLOB '[0-9][0-9][0-9]'
    GROUP BY 1 ORDER BY count(DISTINCT case_mkey) DESC LIMIT 6
  )
  SELECT e.\"tier2Number\" AS event, max(e.\"eventTier2Name\") AS name, year(c.\"eventDate\") AS year, count(DISTINCT e.case_mkey) AS cases
  FROM 'https://openairdocs.org/data/latest/ntsb_events.parquet' e JOIN 'https://openairdocs.org/data/latest/ntsb_case_detail.parquet' c ON c.\"mKey\" = e.case_mkey
  WHERE e.\"isDefiningEvent\" AND e.\"tier2Number\" IN (SELECT event FROM top)
  GROUP BY 1, 3
  ORDER BY 1, 3"

Prints the counts as CSV. It reads the release’s Parquet files over HTTPS, so there’s nothing to download first. Install DuckDB to run it.

By phase of flight and category

Phase of flight
  • Landing8,944 cases
  • Enroute5,705 cases
  • Maneuvering3,685 cases
  • Takeoff3,587 cases
  • Approach3,349 cases
  • Initial climb2,917 cases
  • Taxi915 cases
  • Unknown837 cases
  • Standing425 cases
  • Emergency descent269 cases
  • Prior to flight136 cases
  • Other95 cases

When the defining event happened. Landing covers the flare and landing roll, and so on.

CICTT occurrence category
  • System/Component Failure (Powerplant)4,909 cases
  • Loss Of Control (Inflight)4,823 cases
  • Loss Of Control (Ground)3,955 cases
  • Abnormal Runway Contact3,709 cases
  • System/Component Failure (Non-Powerplant)1,829 cases
  • Fuel1,741 cases
  • Unknown1,528 cases
  • Other1,336 cases
  • CFIT854 cases
  • Collision During Takeoff/Land802 cases
  • Runway Excursion793 cases
  • Low Altitude Operation/Event646 cases
  • Ground Collision500 cases
  • Turbulence390 cases
  • Fire376 cases

The international taxonomy (the CAST/ICAO Common Taxonomy Team’s) NTSB maps each event to.

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'))
  SELECT * FROM (
  SELECT 'Phase of flight' AS kind, n.name, count(DISTINCT e.case_mkey) AS cases
  FROM 'https://openairdocs.org/data/latest/ntsb_events.parquet' e JOIN phase_names n
    ON n.main = CASE WHEN TRY_CAST(e.\"tier1Number\" AS INTEGER) >= 990 THEN 990 ELSE TRY_CAST(e.\"tier1Number\" AS INTEGER) // 50 * 50 END
  WHERE e.\"isDefiningEvent\" AND e.\"tier1Number\" GLOB '[0-9][0-9]*'
  GROUP BY ALL
  UNION ALL
  SELECT 'CICTT category', e.\"cicttEventSOEGroup\", count(DISTINCT e.case_mkey)
  FROM 'https://openairdocs.org/data/latest/ntsb_events.parquet' e
  WHERE e.\"isDefiningEvent\" AND e.\"cicttEventSOEGroup\" <> ''
  GROUP BY ALL
  )
  QUALIFY row_number() OVER (PARTITION BY kind ORDER BY cases DESC) <= 15
  ORDER BY kind, cases DESC"

Prints the counts as CSV. It reads the release’s Parquet files over HTTPS, so there’s nothing to download first. Install DuckDB to run it.

All 92 defining events

NTSB has coded findings and defining events since 2008. Earlier cases used its older occurrence and cause codes, so they aren’t counted here.