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

无需子查询获取各ID最早日期对应Stake - SQL技术问询

解决获取每个ID最早日期对应Stake值的高效方案

嘿,我明白你遇到的问题了——原来的GROUP BY stake, id确实不对,因为它会把相同ID和Stake的记录分组,但你要的是每个ID最早日期对应的那条Stake,分组字段里加Stake完全没必要,反而会拆分组,导致结果错误。

不想用嵌套子查询的话,这里有几个高效的替代方案,适配不同的数据库场景:

1. 标准SQL通用方案:JOIN + 聚合子查询

这是所有关系型数据库都支持的写法,而且优化器通常能很好地处理它,尤其是当你在id和date上建了联合索引的时候:

SELECT t.id, t.date, t.stake
FROM your_table t
JOIN (
    SELECT id, MIN(date) AS min_date
    FROM your_table
    GROUP BY id
) m 
ON t.id = m.id AND t.date = m.min_date;

这个思路很简单:先通过子查询拿到每个ID的最早日期,再通过JOIN关联回原表,匹配到对应的Stake值。虽然有子查询,但它不是嵌套在SELECT的FROM里的多层嵌套结构,逻辑清晰且性能稳定。

2. PostgreSQL专属:DISTINCT ON语法

如果你用的是PostgreSQL,那这个写法绝对是最简洁高效的,完全不需要子查询:

SELECT DISTINCT ON (id) id, date, stake
FROM your_table
ORDER BY id, date ASC;

DISTINCT ON (id)会告诉PostgreSQL:按照ID分组,只保留每个分组里按ORDER BY排序后的第一行。这里我们按ID排序后再按日期升序,第一行自然就是每个ID最早日期的记录。

3. SQL Server专属:TOP 1 WITH TIES + 窗口函数

SQL Server也有专属的简洁写法,不需要嵌套子查询,直接用TOP 1 WITH TIES结合窗口函数:

SELECT TOP 1 WITH TIES id, date, stake
FROM your_table
ORDER BY ROW_NUMBER() OVER (PARTITION BY id ORDER BY date ASC);

TOP 1 WITH TIES会返回所有在ORDER BY中排名为1的行,配合按ID分区、日期升序的ROW_NUMBER,就能直接拿到每个ID最早日期的那条记录。

性能小贴士

不管用哪种方案,给id和date建一个联合索引都能大幅提升查询速度:

CREATE INDEX idx_id_date ON your_table(id, date);

这样数据库可以直接通过索引快速定位到每个ID的最早日期记录,避免全表扫描。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:13:13