MySQL查询:获取各年份最后可用月份的employee_count数据
MySQL查询:提取每年最后可用月份的员工数量
现有一张包含year、month、employee_count字段的数据表,需提取每个年份中最后可用月份对应的员工数量数据。
原始表数据
| 年份(year) | 月份(month) | 员工数量(employee_count) |
|---|---|---|
| 2010 | 1 | 230 |
| 2013 | 6 | 1205 |
| 2022 | 1 | 200 |
| 2023 | 1 | 20 |
| 2013 | 5 | 123 |
| 2010 | 11 | 33 |
| 2023 | 10 | 45 |
期望查询结果
| 年份(year) | 月份(month) | 员工数量(employee_count) |
|---|---|---|
| 2010 | 11 | 33 |
| 2013 | 6 | 1205 |
| 2022 | 1 | 200 |
| 2023 | 10 | 45 |
解决方案
方法1:子查询关联(兼容所有MySQL版本)
先通过子查询获取各年份的最大月份,再关联原表匹配对应数据:
SELECT t.year, t.month, t.employee_count FROM your_table t INNER JOIN ( SELECT year, MAX(month) AS max_month FROM your_table GROUP BY year ) tm ON t.year = tm.year AND t.month = tm.max_month;
将语句中的your_table替换为实际数据表名即可,该写法适配MySQL 5.x及以上所有版本。
方法2:窗口函数(MySQL 8.0+适用)
利用ROW_NUMBER()窗口函数按年份分组、月份倒序排序,筛选每组第一条数据:
SELECT year, month, employee_count FROM ( SELECT year, month, employee_count, ROW_NUMBER() OVER (PARTITION BY year ORDER BY month DESC) AS rn FROM your_table ) t WHERE rn = 1;
- 该写法更简洁高效,仅支持MySQL 8.0及更高版本。
- 若同一年份存在多个相同的最大月份记录,
ROW_NUMBER()会随机返回一条;如需保留所有符合条件的记录,可将ROW_NUMBER()替换为RANK()或DENSE_RANK()。
内容的提问来源于stack exchange,提问作者NewBee
相关产品推荐
相关产品推荐

