PostgreSQL GROUP BY:另一个WHERE上的SELECT列第三列= x

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)

...这将给我我正在寻找的输出:albertesther.

但我更愿意在一个查询中实现这一点.我想知道这是否可能?

Erw*_*ter 7

这应该是最简单和最快的:

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小提琴.

此相关答案中的详细信息,链接和说明: