如何用SQL按ID对比日期列并生成对应结果列?
按ID分组判断日期是否全部相同的SQL实现
你的原SQL语句存在逻辑问题,达不到需求:
- 你按
id, title, date分组,相当于把每个不同的日期单独划成一组,每组里的max(date)必然等于当前行的date,所以new_column会全显示Same,完全无法判断同一ID下的日期是否全部一致。 - 语句里的
distinct是多余的,group by已经会自动去重分组后的结果。
正确的实现思路是先按ID单独分组,判断该ID下所有日期是否一致,再把这个判断结果关联回原表的每一行:
方法一:使用CTE(通用表表达式)
WITH id_date_status AS ( SELECT id, -- 同一ID下最小日期等于最大日期,说明所有日期相同 CASE WHEN MIN(date) = MAX(date) THEN 'Same' ELSE 'Different' END AS new_column FROM your_table WHERE id IN ('21','22') GROUP BY id ) SELECT t.id, t.title, t.date, s.new_column FROM your_table t INNER JOIN id_date_status s ON t.id = s.id WHERE t.id IN ('21','22');
方法二:使用子查询关联
SELECT t.id, t.title, t.date, CASE WHEN date_check.min_date = date_check.max_date THEN 'Same' ELSE 'Different' END AS new_column FROM your_table t INNER JOIN ( SELECT id, MIN(date) AS min_date, MAX(date) AS max_date FROM your_table WHERE id IN ('21','22') GROUP BY id ) date_check ON t.id = date_check.id WHERE t.id IN ('21','22');
这两种方法都是先通过分组得到每个ID的日期一致性状态,再关联原表,让同一ID下的所有行都带上对应的Same或Different标记,完全符合你的需求。
内容的提问来源于stack exchange,提问作者suzy
相关产品推荐
相关产品推荐

