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

如何在SQL关联表中获取ID唯一且Status=1的最早记录

问题根源

你写的SQL之所以返回两条A123的记录,是因为分组条件里包含了table1.Code。ID为A123的记录中,有两个Code(1234和5477)符合Status=1的条件,按ID+Code分组后,自然生成两条独立的分组结果,不符合ID唯一的要求。

两种可行的解决办法

办法一:先锁定每个ID的最早日期,再回查对应记录

先通过子查询找出每个符合条件的ID的最早Date,再关联原表拿到对应的Code和Status:

SELECT t1.ID, t1.Code, t1.Date, t2.Status
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.Code = t2.Code
INNER JOIN (
    -- 子查询获取每个ID的最早日期
    SELECT ID, MIN(Date) AS earliest_date
    FROM Table1
    INNER JOIN Table2 ON Table1.Code = Table2.Code
    WHERE Table2.Status = '1'
    GROUP BY ID
) t_date ON t1.ID = t_date.ID AND t1.Date = t_date.earliest_date
WHERE t2.Status = '1'

办法二:用窗口函数排序取首条

利用ROW_NUMBER()窗口函数,按ID分组、Date升序排序,取每个组的第一条记录:

WITH filtered_ranked AS (
    SELECT 
        t1.ID,
        t1.Code,
        t1.Date,
        t2.Status,
        -- 按ID分组,日期最早的排第1
        ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY t1.Date ASC) AS row_num
    FROM Table1 t1
    INNER JOIN Table2 t2 ON t1.Code = t2.Code
    WHERE t2.Status = '1'
)
SELECT ID, Code, Date, Status
FROM filtered_ranked
WHERE row_num = 1
执行结果

不管用哪种办法,最终都会得到你想要的结果:

| ID       | Code     | Date     | Status |
|--------- | ---------|----------|--------|
|A123      |1234      |10/9/2018 |1       |
|B666      |9088      |1/2/2021  |1       |
|C7633     |1048      |2/5/2019  |1       |

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 16:05:19