mysql - 如何选择第一次出现列值的行?
问题描述
我有 3 张桌子:
date_table(date, country_id, policy_id, ...)
country_table(country_id, country, ...)
policy_table(policy_id, policy, ...)
我想为表格中的最早日期选择country
and 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
. 如果我确实包含它,我会得到country
AND的最早日期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;
解决方案
你可以使用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;
推荐阅读
- mysql - MySQL LOAD DATA LOCAL INFILE - 当分隔符不匹配时想要失败
- php - 在 WooCommerce 可变产品属性下拉选项中添加最小价格差异
- sql - 使用数组进行选择
- python - 如何通过夹具将测试状态传递给它的拆卸
- java - 如何在文本区域输入中保留格式?
- excel - Worksheet_Change 事件是否适用于 Office 2016 for Mac?
- ios - 从选择器视图(选择器轮)中获取选定的值
- git - 如果 Linter 在每一行都抛出错误,如何工作?
- node.js - NestJS:PostgreSQL 中不区分大小写的搜索
- python - Discord.py 大众禁令