首页 > 解决方案 > 如何选择第一次出现列值的行?

问题描述

我有 3 张桌子:

date_table(date, country_id, policy_id, ...)
country_table(country_id, country, ...)
policy_table(policy_id, policy, ...)

我想为表格中的最早日期选择countryand policy

所以如果我有:

UK | Taxation| 01/01/2021
UK | Brexit  | 02/01/2021
FR | Travel  | 05/01/2021

我想返回这个:

UK | Taxation| 01/01/2021
FR | Travel  | 05/01/2021

但是,如果我尝试使用GROUP BY我会收到一个错误,因为我不包含policy. 如果我确实包含它,我会得到countryAND的最早日期policy,这不是我想要的。这是我到目前为止所拥有的:

SELECT country
     , policy
     , MIN(date)
  FROM date_table AS d
  JOIN country_table AS c 
    ON d.country_id = c.country_id
  JOIN policy_table AS p 
    ON p.policy_id = d.policy_id
 WHERE date IS NOT NULL
 GROUP 
    BY country, policy
 ORDER 
    BY date;

标签: mysql

解决方案


你可以使用dense_rank窗口函数来解决这个问题

您可以按如下方式修改您的查询

select country, policy, date 
    from(
        SELECT country, policy, date, dense_rank() over(partition by country order by date) as rnk
        FROM date_table AS d
        JOIN country_table AS c ON d.country_id = c.country_id
        JOIN policy_table AS p ON p.policy_id = d.policy_id
        WHERE date IS NOT NULL) tmp 
 where rnk = 1
order by date;

推荐阅读