如何筛选各国家对应最早日期的行?SQL多表查询问题
解决每个国家最早日期对应政策的查询问题
我明白你碰到的困扰了——之前用GROUP BY country, policy的写法,会把每个国家里不同政策的组合都单独分组,结果就变成了每个“国家+政策”组合的最早日期,完全不符合你要每个国家整体最早日期对应政策的需求。
下面给你两种靠谱的解决方案,任选其一就行:
方法一:子查询先找每个国家的最早日期,再关联回原表
这种思路是先定位每个国家的最早日期,再通过这个日期匹配到对应的政策记录,逻辑很直观:
SELECT c.country, p.policy, d.date FROM date_table d JOIN country_table c ON d.country_id = c.country_id JOIN policy_table p ON d.policy_id = p.policy_id -- 子查询:按国家分组,拿到每个国家的最早日期 JOIN ( SELECT country_id, MIN(date) AS earliest_date FROM date_table WHERE date IS NOT NULL GROUP BY country_id ) AS sub ON d.country_id = sub.country_id AND d.date = sub.earliest_date WHERE d.date IS NOT NULL ORDER BY d.date;
方法二:用窗口函数(更简洁)
窗口函数可以直接给每个国家的记录按日期排序,然后取排序后的第一条,代码更紧凑:
SELECT country, policy, date FROM ( SELECT c.country, p.policy, d.date, -- 按国家分组,组内按日期升序排序,给每条记录标序号 ROW_NUMBER() OVER (PARTITION BY c.country_id ORDER BY d.date ASC) AS rn FROM date_table d JOIN country_table c ON d.country_id = c.country_id JOIN policy_table p ON d.policy_id = p.policy_id WHERE d.date IS NOT NULL ) AS ranked -- 取每个国家的第一条(也就是最早日期的记录) WHERE rn = 1 ORDER BY date;
补充说明
如果存在同一个国家在最早当天有多个政策的情况,上面的ROW_NUMBER()只会返回其中一条。要是想保留所有同一天的政策,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK(),这样同一天的记录都会被标为1,外层筛选时就能全部返回。
内容的提问来源于stack exchange,提问作者anInputName
相关产品推荐
相关产品推荐

