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 个唯一行的主要内容,如果未能解决你的问题,请参考以下文章

没有选择的Postgres条件唯一约束

为每个用户选择最新条目而不使用 group by (postgres)

Postgres如何使2个数字字段彼此唯一

如何使用 Sequelize.JS 选择具有 2 个唯一列的所有行?

为每个唯一 ID 选择最近 30 个日期

postgres 综合性能