查询记录以获取某些属性值

时间:2018-09-11 19:53:28

标签: sql postgresql greatest-n-per-group

我有一个具有以下方案的表格(idMovie,类型,标题,评分)。

我如何进行查询以返回每种类型的最佳评级的十部电影?

我认为可以使用“ ORDER BY”和“ LIMIT”来解决该类型的前10名问题,但我不知道如何针对每种类型做到这一点。

免责声明:我是sql的新手。

1 个答案:

答案 0 :(得分:5)

这是一个典型的问题,称为“ 每组最多N个”。通常无法使用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