如何查询两表中各ID的最早日期并筛选不匹配记录
问题分析与解决方法
你的需求是按ID分组,获取两张表中每个ID的最早StartDate,并筛选出这两个日期不匹配的ID,原SQL存在几个关键问题:
- 子查询未按ID分组,取的是全表最小日期而非每个ID的最早日期
- 直接关联两张表会产生笛卡尔积,导致数据混乱
- group by和where条件的逻辑不符合需求,无法实现按ID对比最早日期
正确解法
我们可以先分别统计两张表中每个ID的最小StartDate,再通过ID关联这两个结果集,最后筛选出日期不相等的记录。
方法1:使用子查询关联
SELECT hp.ID, hp.historical_min_date, cn.country_min_date FROM (SELECT ID, MIN(StartDate) AS historical_min_date FROM Historical_Period GROUP BY ID) hp JOIN (SELECT ID, MIN(StartDate) AS country_min_date FROM CountryName GROUP BY ID) cn ON hp.ID = cn.ID WHERE hp.historical_min_date <> cn.country_min_date;
方法2:使用CTE(公共表表达式)
WITH Historical_Min AS ( SELECT ID, MIN(StartDate) AS historical_min_date FROM Historical_Period GROUP BY ID ), Country_Min AS ( SELECT ID, MIN(StartDate) AS country_min_date FROM CountryName GROUP BY ID ) SELECT hm.ID, hm.historical_min_date, cm.country_min_date FROM Historical_Min hm JOIN Country_Min cm ON hm.ID = cm.ID WHERE hm.historical_min_date <> cm.country_min_date;
测试结果
针对你提供的测试数据:
- Historical_Period中ID=1的最早日期是
18020101 - CountryName中ID=1的最早日期是
15161129
执行上述SQL后,会返回这条ID=1的记录,因为两个日期不匹配。
内容的提问来源于stack exchange,提问作者Illy
相关产品推荐
相关产品推荐

