Postgres:为 ID 选择 n 个唯一行
Posted
技术标签:
【中文标题】Postgres:为 ID 选择 n 个唯一行【英文标题】:Postgres: select n unique rows for ID 【发布时间】:2015-06-08 21:45:13 【问题描述】:使用 Postgres 我有一个场景,我需要为 sql 语句中的每个唯一 id 返回可变数量的行。
假设我有一张用户多年来拥有的汽车的表格。
+----+----------+---------+-------+
| ID | make | model | type |
+----+----------+---------+-------+
| 1 | toyota | camry | sedan |
| 1 | ford | mustang | coupe |
| 1 | toyota | celica | coupe |
| 1 | bmw | z4 | coupe |
| 1 | honda | accord | sedan |
| 2 | buick | marque | sedan |
| 2 | delorean | btf | coupe |
| 2 | mini | cooper | coupe |
| 3 | ford | f-150 | truck |
| 3 | ford | mustang | coupe |
| 1 | ford | taurus | sedan |
+--------+----------+-------+-----+
从此表中,我只想为每个拥有 coupe 的用户返回两行,而忽略其余行。
类似的东西。我还想保留空列,以便 ID 3 的第二个结果为空,因为只有一辆轿跑车类型的汽车。我也在处理限制,因为这必须运行 AWS Reshift。所以,我不能使用很多功能。使用 SQL Server 中的 Top 语句似乎很容易,但由于 Redshift 限制和我缺乏知识,我不确定最好的方法。
+----+----------+---------+-------+
| ID | make | model | type |
+----+----------+---------+-------+
| 1 | ford | mustang | coupe |
| 1 | toyota | celica | coupe |
| 2 | delorean | btf | coupe |
| 2 | mini | cooper | coupe |
| 3 | ford | mustang | coupe |
| 3 | | | |
+--------+----------+-------+-----+
非常感谢您的帮助。
【问题讨论】:
【参考方案1】:据我所知,Redshift 支持window functions:
select id, make, model, type
from (
select id, make, model, type,
row_number() over (partition by id order by make) as rn
from the_table
where type = 'coupe'
) t
where rn <= 2
order by id, make;
【讨论】:
谢谢!这也完全符合我的需要。再次感谢!以上是关于Postgres:为 ID 选择 n 个唯一行的主要内容,如果未能解决你的问题,请参考以下文章
为每个用户选择最新条目而不使用 group by (postgres)