Fra*_*acu 3 sql postgresql greatest-n-per-group
假设我们在PostgreSQL中有两个表:
表"公民"
country_ref citizen_name entry_date
-----------------------------------------------------
0 peter 2013-01-14 21:00:00.000
1 fernando 2013-01-14 20:00:00.000
0 robert 2013-01-14 19:00:00.000
3 albert 2013-01-14 18:00:00.000
2 esther 2013-01-14 17:00:00.000
1 juan 2013-01-14 16:00:00.000
3 egbert 2013-01-14 15:00:00.000
1 francisco 2013-01-14 14:00:00.000
3 adolph 2013-01-14 13:00:00.000
2 emilie 2013-01-14 12:00:00.000
2 jacques 2013-01-14 11:00:00.000
0 david 2013-01-14 10:00:00.000
Run Code Online (Sandbox Code Playgroud)
表"国家"
country_id country_name country_group
-------------------------------------------
0 england 0
1 spain 0
2 france 1
3 germany 1
Run Code Online (Sandbox Code Playgroud)
现在我想获得给定country_group的每个国家的"公民"表上最后输入的公民.
到目前为止,我最好的尝试是这个查询(我们称之为Query_1):
SELECT country_ref, MAX(entry_date) FROM citizens
LEFT JOIN countries ON country_id = country_ref
WHERE country_group = 1 GROUP BY country_ref
Run Code Online (Sandbox Code Playgroud)
输出:
country_ref max
---------------------------------
3 2013-01-14 18:00:00
2 2013-01-14 17:00:00
Run Code Online (Sandbox Code Playgroud)
那么我可以这样做:
SELECT citizen_name FROM citizens WHERE (country_ref, entry_date) IN (Query_1)
Run Code Online (Sandbox Code Playgroud)
...这将给我我正在寻找的输出:albert和esther.
但我更愿意在一个查询中实现这一点.我想知道这是否可能?
这应该是最简单和最快的:
SELECT DISTINCT ON (i.country_ref)
i.citizen_name
FROM citizens i
JOIN countries o ON o.country_id = i.country_ref
WHERE o.country_group = 1
ORDER BY i.country_ref, i.entry_date DESC
Run Code Online (Sandbox Code Playgroud)
只需将它们添加到SELECT列表中,即可轻松地从两个表中返回更多列.
SQL小提琴.
此相关答案中的详细信息,链接和说明:
| 归档时间: |
|
| 查看次数: |
6844 次 |
| 最近记录: |