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

SQL中按GATEVISITNUMBER分组获取首/后续SUB_TYPE值的方法

解决方案

问题出在你使用LAG()时没有指定分区(PARTITION BY),导致窗口函数跨GATEVISITNUMBER取值。要实现需求,核心是按GATEVISITNUMBER分组,再对组内数据按TIME排序,提取第一个和后续的SUB_TYPE(示例中为第二个,若有更多后续可扩展)。

方法1:窗口函数+条件聚合

先给每个GATEVISITNUMBER下的记录按时间排序编号,再通过聚合函数提取对应位置的SUB_TYPE:

SELECT
    GATEVISITNUMBER,
    MAX(CASE WHEN rn = 1 THEN SUB_TYPE END) AS SUB_TYPE,
    MAX(CASE WHEN rn = 2 THEN SUB_TYPE END) AS SUB_TYPE2
FROM (
    SELECT
        GATEVISITNUMBER,
        SUB_TYPE,
        TIME,
        ROW_NUMBER() OVER (PARTITION BY GATEVISITNUMBER ORDER BY TIME) AS rn
    FROM your_table_name
) t
GROUP BY GATEVISITNUMBER;
  • PARTITION BY GATEVISITNUMBER确保窗口函数只在同一个GATEVISITNUMBER的范围内计算
  • ROW_NUMBER()按时间给组内记录排序编号
  • 外层用MAX()+CASE提取第1、2位的SUB_TYPE,没有对应位置时自动返回NULL

方法2:修正窗口函数用法(提取组内下一条数据)

如果坚持用窗口函数直接获取后续值,LEAD()比LAG()更适配需求,结合分区和过滤只保留每组第一条记录:

SELECT
    GATEVISITNUMBER,
    SUB_TYPE,
    next_sub_type AS SUB_TYPE2
FROM (
    SELECT
        GATEVISITNUMBER,
        SUB_TYPE,
        LEAD(SUB_TYPE) OVER (PARTITION BY GATEVISITNUMBER ORDER BY TIME) AS next_sub_type,
        ROW_NUMBER() OVER (PARTITION BY GATEVISITNUMBER ORDER BY TIME) AS rn
    FROM your_table_name
) t
WHERE rn = 1;
  • LEAD()用于获取组内下一条记录的SUB_TYPE,无后续数据时返回NULL
  • 过滤rn=1只保留每组的第一条记录,同时带出后续的SUB_TYPE

两种方法都能避免跨GATEVISITNUMBER取值的问题,且单个条目的SUB_TYPE2会自动返回NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:12:37