【问题标题】:Consult records for certain values of an attribute [duplicate]查询属性的某些值的记录[重复]
【发布时间】:2019-02-16 09:27:08
【问题描述】:
我有一张表格,其中包含以下方案(idMovie、流派、标题、评级)。
如何进行查询以返回每种类型评分最高的十部电影?
我认为可以使用 'ORDER BY' 和 'LIMIT' 来获得一个流派的前 10 名,但我不知道如何为每个流派做到这一点。
免责声明:我是 sql 新手。
【问题讨论】:
标签:
sql
postgresql
greatest-n-per-group
【解决方案1】:
这是一个典型的问题,称为 greatest-N-per-group。这通常无法使用order by + limit 解决(除非您使用LATERAL,在我看来这更复杂),因为正如您所提到的,它是对最大 N 问题但不是每个组的问题的答案。在您的情况下,电影类型是组。
您可以使用dense_rank 窗口函数根据子查询中每种类型的评分生成排名,然后选择前 10 名:
select title, rating
from (
select title, rating, dense_rank() over (partition by genre order by rating desc) as rn
from yourtable
) t
where rn <= 10
这可能会为每种类型返回超过 10 个标题,因为可能存在关联(属于一种类型的不同电影的评级相同)。如果您只想要前 10 名而不查看平局,请使用 row_number 而不是 dense_rank。