Select 每个城市最贵的 2 辆汽车

Select 2 most expensive cars for every city

我想select每个城市有2辆最贵的车。

下面的 DDL:

create table city_car 
(
    id bigserial,
    city varchar(255),
    car varchar(255),
    price int,
    primary key (id)
);

insert into city_car(city, car, price) 
values
    ('los angeles', 'kia rio', 550),
    ('los angeles', 'audi a4', 1800),
    ('los angeles', 'lexus nx', 2000),
    ('los angeles', 'chevrolet camaro', 2800),
    ('los angeles', 'mazda 6', 1300),
    ('moscow', 'mazda 3', 1000),
    ('moscow', 'kia cerato', 1000),
    ('moscow', 'lexus nx', 2100),
    ('moscow', 'lexus lx', 5000),
    ('moscow', 'bmw x6', 5000),
    ('prague', 'skoda octavia', 1000);

输出应与以下所有列的列表相同:

city          name              price
-----------------------------------------
'los angeles' 'lexus nx'         2000 
'los angeles' 'chevrolet camaro' 2800 
'moscow'      'lexus lx'         5000 
'moscow'      'bmw x6'           5000 
'prague'      'skoda octavia'    1000

problems are typically solved using window functions:

select city,car,price
from (
  select *, 
         dense_rank() over (partition by city order by price desc) as rnk
  from city_car
) t
where rnk <= 2
order by city, price desc;

根据你想如何处理出现两次的最高值,你可以将dense_rank()改为row_number()

在线示例:http://rextester.com/ALKZ85776