[英]PostgreSQL GROUP BY: SELECT column on MAX of another WHERE a third column = x
假設我們在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
表“國家”
country_id country_name country_group
-------------------------------------------
0 england 0
1 spain 0
2 france 1
3 germany 1
現在我想獲得給定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
輸出:
country_ref max
---------------------------------
3 2013-01-14 18:00:00
2 2013-01-14 17:00:00
那么我可以這樣做:
SELECT citizen_name FROM citizens WHERE (country_ref, entry_date) IN (Query_1)
...這將給我我正在尋找的輸出: 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
只需將它們添加到SELECT
列表中,即可輕松地從兩個表中返回更多列。
SQL小提琴。
此相關答案中的詳細信息,鏈接和說明:
SELECT citizen_name,
country_ref,
entry_date
from (
SELECT cit.citizen_name,
cit.country_ref,
MAX(cit.entry_date) over (partition by cit.country_ref) as max_date,
cit.entry_date
FROM citizens cit
LEFT JOIN countries cou ON cou.country_id = cit.country_ref
WHERE cou.country_group = 1
) t
where max_date = entry_date
SQLFiddle演示: http ://www.sqlfiddle.com/#!12/50776/1
你為什么不簡單地說:
SELECT citizen_name FROM citizens WHERE (country_ref, entry_date) IN (
SELECT country_ref, MAX(entry_date) FROM citizens
LEFT JOIN countries ON country_id = country_ref
WHERE country_group = 1 GROUP BY country_ref
)
它可能不是最好的計划,但它取決於許多因素,而且編寫起來很簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.