Sql 为每个城市选择2辆最昂贵的汽车

Sql 为每个城市选择2辆最昂贵的汽车,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,我想为每个城市选择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 angel

我想为每个城市选择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
问题通常通过以下方式解决:

根据您希望如何处理两次出现的最高值,您可以将稠密等级更改为行数


在线示例:

根据示例数据,它可能是一个行号,而不是密集的排名
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;