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

如何筛选证券最早激活记录并获取两查询结果的交集ID

SQL问题解决方案

一、获取每个id最早的激活记录

针对每个id存在多条激活记录的情况,以下两种方法可以筛选出最早的那条:

方法1:GROUP BY 结合 MIN()

如果只需要id和对应的最早激活时间,用这个最简单:

SELECT id, MIN(timestamp) AS earliest_activation_time
FROM sval
WHERE fid = 4044 AND val = 'True'
GROUP BY id;

如果需要保留该条记录的所有字段(比如fid、val),可以通过子查询关联原表:

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

方法2:窗口函数 ROW_NUMBER()

这种方式更灵活,适合需要处理复杂排序逻辑的场景:

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

说明:PARTITION BY id 按id分组,ORDER BY timestamp ASC 让每组内记录按时间升序排列,rn=1 就代表每组的第一条(即最早的激活记录)。

二、筛选同时存在于两个结果中的id

要找出既在激活记录里,又在ival表指定条件下的id,三种常用实现方式:

方法1:IN 子查询

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

方法2:INNER JOIN

SELECT DISTINCT s.id
FROM sval s
INNER JOIN ival i ON s.id = i.id
WHERE s.fid = 4044 AND s.val = 'True'
AND i.fid = 3994 AND i.val = 0;

方法3:EXISTS 子查询

SELECT DISTINCT id
FROM sval s
WHERE fid = 4044 AND val = 'True'
AND EXISTS (
    SELECT 1
    FROM ival i
    WHERE i.id = s.id
    AND i.fid = 3994 AND i.val = 0
);

内容的提问来源于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:10:08