Snowflake SQL查询需求:筛选bygr与calc_date同时变更的记录
Snowflake SQL 解决方案:筛选同一startdate下bygr与calc_date均变更的记录
可以通过窗口函数LAG()对比同一startdate和name分组内的前后记录,精准筛选出两个字段均发生变更的行,具体实现如下:
WITH record_changes AS ( SELECT nr, name, startdate, calc_date, bygr, -- 取同组内上一条记录的bygr值 LAG(bygr) OVER (PARTITION BY startdate, name ORDER BY calc_date) AS prev_bygr, -- 取同组内上一条记录的calc_date值 LAG(calc_date) OVER (PARTITION BY startdate, name ORDER BY calc_date) AS prev_calc_date FROM your_table_name -- 替换为你的实际表名 ) SELECT nr, name, startdate, calc_date, bygr FROM record_changes WHERE -- 判定bygr和calc_date均与上一条记录不同 bygr IS DISTINCT FROM prev_bygr AND calc_date IS DISTINCT FROM prev_calc_date -- 排除分组内的第一条记录(无前置对比项) AND prev_bygr IS NOT NULL;
关键说明:
- 窗口函数逻辑:
PARTITION BY startdate, name确保只在同一日期、同一人员的范围内对比;ORDER BY calc_date保证按时间顺序取前一条记录,符合变更的时间逻辑。 - NULL值兼容:使用
IS DISTINCT FROM而非!=,避免因字段为NULL导致的对比失效(Snowflake原生支持该语法)。 - 筛选逻辑:仅保留同时满足
bygr和calc_date均发生变更的行,且排除每组中无前置记录的首行。
如果需要包含每组中首次出现的记录(作为变更的起始参照),可以去掉AND prev_bygr IS NOT NULL条件,同时可在结果中新增标记字段区分初始记录。
内容的提问来源于stack exchange,提问作者Diana Behr
相关产品推荐
相关产品推荐

