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.
CICTT occurrence categories (PDF)CICTT phases of flight (PDF)
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.
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
Run 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.
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.
| 2008 | 224 |
|---|---|
| 2009 | 226 |
| 2010 | 188 |
| 2011 | 203 |
| 2012 | 236 |
| 2013 | 180 |
| 2014 | 171 |
| 2015 | 185 |
| 2016 | 220 |
| 2017 | 231 |
| 2018 | 240 |
| 2019 | 230 |
| 2020 | 204 |
| 2021 | 185 |
| 2022 | 202 |
| 2023 | 210 |
| 2024 | 199 |
| 2025 | 157 |
| 2026 | 143 |
3,834 cases
| 2008 | 253 |
|---|---|
| 2009 | 231 |
| 2010 | 195 |
| 2011 | 247 |
| 2012 | 241 |
| 2013 | 213 |
| 2014 | 246 |
| 2015 | 216 |
| 2016 | 217 |
| 2017 | 215 |
| 2018 | 194 |
| 2019 | 231 |
| 2020 | 198 |
| 2021 | 188 |
| 2022 | 195 |
| 2023 | 171 |
| 2024 | 141 |
| 2025 | 155 |
| 2026 | 85 |
3,832 cases
| 2008 | 180 |
|---|---|
| 2009 | 167 |
| 2010 | 175 |
| 2011 | 174 |
| 2012 | 166 |
| 2013 | 167 |
| 2014 | 152 |
| 2015 | 157 |
| 2016 | 142 |
| 2017 | 148 |
| 2018 | 137 |
| 2019 | 141 |
| 2020 | 94 |
| 2021 | 183 |
| 2022 | 111 |
| 2023 | 108 |
| 2024 | 118 |
| 2025 | 179 |
| 2026 | 122 |
2,821 cases
| 2008 | 12 |
|---|---|
| 2009 | 20 |
| 2010 | 33 |
| 2011 | 34 |
| 2012 | 36 |
| 2013 | 32 |
| 2014 | 56 |
| 2015 | 72 |
| 2016 | 92 |
| 2017 | 78 |
| 2018 | 94 |
| 2019 | 67 |
| 2020 | 73 |
| 2021 | 89 |
| 2022 | 105 |
| 2023 | 134 |
| 2024 | 117 |
| 2025 | 118 |
| 2026 | 253 |
1,515 cases
| 2008 | 75 |
|---|---|
| 2009 | 75 |
| 2010 | 78 |
| 2011 | 88 |
| 2012 | 95 |
| 2013 | 62 |
| 2014 | 88 |
| 2015 | 89 |
| 2016 | 82 |
| 2017 | 66 |
| 2018 | 77 |
| 2019 | 81 |
| 2020 | 58 |
| 2021 | 78 |
| 2022 | 53 |
| 2023 | 64 |
| 2024 | 70 |
| 2025 | 81 |
| 2026 | 57 |
1,417 cases
| 2008 | 111 |
|---|---|
| 2009 | 85 |
| 2010 | 81 |
| 2011 | 79 |
| 2012 | 78 |
| 2013 | 72 |
| 2014 | 61 |
| 2015 | 74 |
| 2016 | 66 |
| 2017 | 53 |
| 2018 | 44 |
| 2019 | 61 |
| 2020 | 52 |
| 2021 | 56 |
| 2022 | 69 |
| 2023 | 60 |
| 2024 | 55 |
| 2025 | 43 |
| 2026 | 45 |
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.
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
Run 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.
By phase of flight and category
When the defining event happened. Landing covers the flare and landing roll, and so on.
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.
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
Run 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.
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.