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

如何对sval表去重重复id并与ival表按timestamp取交集?

解决方案

需求1:过滤sval表,保留每个id对应最早timestamp的记录

提供两种高效实现方式:

方式1:窗口函数精准筛选

通过窗口函数按id分组、时间升序排序,直接取每组第一条(最早时间)记录:

SELECT id, fid, timestamp, val
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp ASC) AS row_num
    FROM sval
    WHERE fid = 4044 AND val = 'True'
) filtered_sval
WHERE row_num = 1;

方式2:聚合函数分组取最小时间

先分组id并提取每组最早时间,再关联原表获取完整记录:

SELECT s.id, s.fid, s.timestamp, s.val
FROM sval s
JOIN (
    SELECT id, MIN(timestamp) AS earliest_ts
    FROM sval
    WHERE fid = 4044 AND val = 'True'
    GROUP BY id
) min_ts ON s.id = min_ts.id AND s.timestamp = min_ts.earliest_ts
WHERE s.fid = 4044 AND s.val = 'True';

需求2:找出ival表中与过滤后sval记录timestamp相同的所有id列表

基于需求1的结果,关联ival表筛选匹配时间的id:

方式1:JOIN关联查询

SELECT DISTINCT i.id
FROM ival i
JOIN (
    SELECT timestamp
    FROM (
        SELECT 
            *,
            ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp ASC) AS row_num
        FROM sval
        WHERE fid = 4044 AND val = 'True'
    ) filtered_sval
    WHERE row_num = 1
) s_ts ON i.timestamp = s_ts.timestamp
WHERE i.fid = 3994 AND i.val = 0;

方式2:IN子查询

SELECT DISTINCT id
FROM ival
WHERE fid = 3994 AND val = 0
AND timestamp IN (
    SELECT MIN(timestamp)
    FROM sval
    WHERE fid = 4044 AND val = 'True'
    GROUP BY id
);

补充说明

  • DISTINCT用于避免ival表中同一时间对应重复id时出现结果重复
  • 两种方式均可实现需求,窗口函数在大数据量场景下性能表现更优

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:56:12