如何在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
相关产品推荐
相关产品推荐

