You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过单条SQL查询获取类型变更时的首条数据记录

需求说明

现有如下表数据:

IDType
1A
2A
3B
4A
5A
6B
7B
8A
9A
10A

需要仅获取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;

逻辑说明

  1. 子查询中,LAG(Type) OVER (ORDER BY ID)按ID排序,将每行Type与上一行Type关联,第一行的prev_type为NULL。
  2. 外层查询筛选两种情况:prev_type为NULL(即第一条记录),或当前行Type与上一行不同(Type变更的首条记录)。
  3. 最终结果即为目标行。

兼容低版本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;

逻辑说明

  1. 初始化变量@prev_type为NULL,按ID排序遍历每行。
  2. 先获取当前变量值(即上一行Type),再将变量更新为当前行Type。
  3. 筛选逻辑与窗口函数版本一致,得到目标记录。

内容的提问来源于stack exchange,提问作者user3408531

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:03:30