SQL: 我如何 select 同一行的两个字段在一个组中?
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_name
和 last_name
可能不在同一行。显然,MIN
(最小值)在这里不是正确的聚合函数。
我的问题:如何强制 first_name
和 last_name
来自同一行?
您可以使用row_number
window函数来查询每组单行:
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
如How to show row numbers in PostgreSQL query?所述
你可以获得一个行号。
然后您可以根据需要 ORDER 或 WHERE 您的 select 语句。
-- 我根据最小值 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
您需要 "DISTINCT ON" 子句,但这需要排序,例如first_name:
SELECT
DISTINCT ON (street)
street, first_name, last_name
FROM table
ORDER BY street, first_name
我正在使用 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_name
和 last_name
可能不在同一行。显然,MIN
(最小值)在这里不是正确的聚合函数。
我的问题:如何强制 first_name
和 last_name
来自同一行?
您可以使用row_number
window函数来查询每组单行:
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
如How to show row numbers in PostgreSQL query?所述 你可以获得一个行号。 然后您可以根据需要 ORDER 或 WHERE 您的 select 语句。
-- 我根据最小值 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
您需要 "DISTINCT ON" 子句,但这需要排序,例如first_name:
SELECT
DISTINCT ON (street)
street, first_name, last_name
FROM table
ORDER BY street, first_name