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

SQL表重叠有效时间槽去重及关联查询实现方案咨询

SQL重叠有效区间去重方案

核心逻辑

利用窗口函数按minor_id分组,同分组内匹配到目标时间点的记录按major_id倒序排序,取排序后的第一条,即可保证重叠场景下仅保留major_id最大的行。

1. 单表查询实现

SELECT * 
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY minor_id ORDER BY major_id DESC) AS rn
    FROM mytable m2 
    WHERE minor_id = 666 
      AND '02.01.2001' >= m2.valid_time_from 
      AND '02.01.2001' < m2.valid_time_until -- 注意与表实际字段名统一,原查询写为valid_time_to请自行调整
) t
WHERE rn = 1;

如果使用支持QUALIFY语法的SQL引擎(如Spark SQL、BigQuery、Snowflake等),可简化为:

SELECT *
FROM mytable m2 
WHERE minor_id = 666 
  AND '02.01.2001' >= m2.valid_time_from 
  AND '02.01.2001' < m2.valid_time_until
QUALIFY ROW_NUMBER() OVER (PARTITION BY minor_id ORDER BY major_id DESC) = 1;

2. 关联查询实现

将mytable的去重逻辑封装为子查询后再与另一张表关联即可:

SELECT * 
FROM my_other_table m2
JOIN (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY minor_id ORDER BY major_id DESC) AS rn
    FROM mytable
) m ON m2.minor_id = m.minor_id 
   AND m2.timestamp >= m.valid_time_from 
   AND m2.timestamp < m.valid_time_until
   AND m.rn = 1;

使用QUALIFY的简化版本:

SELECT * 
FROM my_other_table m2
JOIN mytable m 
  ON m2.minor_id = m.minor_id 
  AND m2.timestamp >= m.valid_time_from 
  AND m2.timestamp < m.valid_time_until
QUALIFY ROW_NUMBER() OVER (PARTITION BY m2.主键字段名 ORDER BY m.major_id DESC) = 1;

注意:简化写法的PARTITION BY中需替换为my_other_table的主键字段,保证每一条主表记录仅匹配一条mytable的行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 17:42:02