Postgres:为ID选择n个唯一行

时间:2015-06-08 21:45:13

标签: sql database postgresql amazon-redshift

使用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 |
+--------+----------+-------+-----+

从这张表中我只想为每个有轿跑车的用户返回两行而忽略其余的行。

等等。我还想保留空列,因此ID 3的第二个结果是空的,因为只有一辆类型为coupe的车。我也在使用限制,因为这必须运行AWS Reshift。所以,我不能使用很多功能。看起来使用像SQL服务器这样的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 个答案:

答案 0 :(得分:2)

据我所知,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;