SQL:如何选择组中同一个SINGLE行的两个字段?

时间:2017-10-12 18:15:45

标签: sql postgresql select greatest-n-per-group postgresql-9.6

我正在使用Postgres 9.6。*

我有这个:

street | first_name | last_name
1st    | james      | bond
1st    | mr         | q 
1st    | ms         | m
2nd    | man        | with_golden_gun

我想获得一个不同地址的列表以及每个地址的第一组'first_name'和'last_name'。

我想要的输出:

street | first_name | last_name
1st    | james      | bond
2nd    | man        | with_golden_gun

我按street进行分组,并尝试MIN(first_name)MIN(last_name) - 然而 - 使用MIN,每组独特的街道都有案例,我可以看似随机混合匹配 first_namelast_name可能不属于同一行。显然,MIN(最小)在这里不是正确的聚合函数。

我的问题:如何强制first_namelast_name 来自同一行

4 个答案:

答案 0 :(得分:1)

您可以使用row_number窗口函数查询每个组的一行:

SELECT street, first_name, last_name
FROM   (SELECT street, first_name, last_name,
               ROW_NUMBER() OVER (PARTITION BY street ORDER BY first_name) AS rn
        FROM   mytable) t
WHERE  rn = 1

答案 1 :(得分:1)

你需要" DISTINCT ON"条款,但这需要排序,例如如first_name:

SELECT
 DISTINCT ON (street)
 street, first_name, last_name
FROM table
ORDER BY street, first_name

答案 2 :(得分:0)

- 我根据min first_name对此进行分组,并根据该名字

获取姓氏
Select street, first_name, 
(select last_name from person o where o.first_name = x.first_name) 
from (Select street, min(first_name) as first_name  
from person v group by street) as x;

- 输出

street | first_name | last_name
-------------------------------------
1st    | james      | bond
2nd    | man        | with_golden_gun

- 如果可以将名字和姓氏结合起来

Select street, min(concat(first_name , ' ' , last_name)) as name
from person group by street

- 输出

street | name 
----------------------------
1st    | james bond
2nd    | man with_golden_gun

答案 3 :(得分:-1)

How to show row numbers in PostgreSQL query?中所述 你可以得到一个行号。 然后,您可以根据需要对SELECT语句进行ORDER或WHERE。