SQL:如何选择组中同一SINGLE行的两个字段?
Posted
技术标签:
【中文标题】SQL:如何选择组中同一SINGLE行的两个字段?【英文标题】:SQL: how do I select two fields of the same SINGLE row in a group? 【发布时间】:2017-10-12 18:15:44 【问题描述】:我使用的是 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
来自同一行?
【问题讨论】:
你在用什么rdbms? 我正在使用 postgres 什么是“第一组'first_name'和'last_name'”? 就我而言,任何两个值的行都相同的集合。我只是不想像“james”+“with_golden_gun”那样混搭作为一组名字和姓氏 我认为@less 是在询问排序的定义——它是按字母顺序排列的吗? 【参考方案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
【讨论】:
【参考方案2】:您需要“DISTINCT ON”子句,但这需要排序,例如名字:
SELECT
DISTINCT ON (street)
street, first_name, last_name
FROM table
ORDER BY street, first_name
【讨论】:
【参考方案3】:-- 我根据 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
【讨论】:
【参考方案4】:如How to show row numbers in PostgreSQL query? 中所述 你可以得到一个行号。 然后您可以根据需要 ORDER 或 WHERE 选择语句。
【讨论】:
不是我的反对意见,但猜测您在这里的回答最好作为评论。链接到另一个答案并说去看看我的答案通常是不好的形式。答案应该是独立的,提供支持的链接。以上是关于SQL:如何选择组中同一SINGLE行的两个字段?的主要内容,如果未能解决你的问题,请参考以下文章