如何通过单条SQL查询获取类型变更时的首条数据记录
需求说明
现有如下表数据:
| ID | Type |
|---|---|
| 1 | A |
| 2 | A |
| 3 | B |
| 4 | A |
| 5 | A |
| 6 | B |
| 7 | B |
| 8 | A |
| 9 | A |
| 10 | A |
需要仅获取ID为1,3,4,6,8的行,也就是每次Type发生变更时的首条记录,同时希望用单条查询替代之前多次查询+代码处理的低效方案。
解决方案(支持窗口函数的数据库)
可以使用LAG()窗口函数获取上一行的Type值,筛选出Type与上一行不同的记录,同时保留第一条记录(无前置行的初始记录)。
SQL语句如下:
SELECT ID, Type FROM ( SELECT ID, Type, LAG(Type) OVER (ORDER BY ID) AS prev_type FROM your_table_name ) AS subquery WHERE prev_type IS NULL OR prev_type != Type ORDER BY ID;
逻辑说明
- 子查询中,
LAG(Type) OVER (ORDER BY ID)按ID排序,将每行Type与上一行Type关联,第一行的prev_type为NULL。 - 外层查询筛选两种情况:
prev_type为NULL(即第一条记录),或当前行Type与上一行不同(Type变更的首条记录)。 - 最终结果即为目标行。
兼容低版本MySQL(无窗口函数)
如果使用MySQL 5.x等不支持窗口函数的版本,可通过变量实现:
SELECT ID, Type FROM ( SELECT ID, Type, @prev_type AS prev_type, @prev_type := Type FROM your_table_name, (SELECT @prev_type := NULL) AS init ORDER BY ID ) AS subquery WHERE prev_type IS NULL OR prev_type != Type ORDER BY ID;
逻辑说明
- 初始化变量
@prev_type为NULL,按ID排序遍历每行。 - 先获取当前变量值(即上一行Type),再将变量更新为当前行Type。
- 筛选逻辑与窗口函数版本一致,得到目标记录。
内容的提问来源于stack exchange,提问作者user3408531
相关产品推荐
相关产品推荐

