繁体   English   中英

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

[英]SQL: how do I select two fields of the same SINGLE row in a group?

我正在使用 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来自同一行

您可以使用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

您需要“DISTINCT ON”子句,但这需要排序,例如 first_name:

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

-- 我根据 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

如何在 PostgreSQL 查询中显示行号中所述? 你可以得到一个行号。 然后,您可以根据需要 ORDER 或 WHERE 选择语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM