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

如何筛选各国家对应最早日期的行?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:23:33