Oracle查询找到第二高
问题描述:
我有这个数据库 电影(ID:INT,名称:字符串,年:INT,等级:FL燕麦)
movies_genres(movie_id:INT,类型:字符串)
我需要网络连接nd 对于每个类型,找到第二最佳评级电影。这可以推广到 找到我的评级电影?
答
考虑使用ROW_NUMBER()
:
SELECT rating maxrating, genre
FROM (
SELECT
rating,
genre,
ROW_NUMBER() OVER (PARTITION BY genre ORDER BY rating DESC) rn
FROM movies_genres mg
JOIN movies m1 ON mg.movie_id=m1.movie_id
GROUP BY rating,genre
) t
WHERE rn = 2
这里是SQL Fiddle。
--edit
我添加GROUP BY rating,genre
以除去可能的重复。正如@JW正确指出的那样,您还可以用DENSE_RANK
替换ROW_NUMBER
,这将为您处理分组。
祝你好运。
我宁愿使用[DENSE_RANK](http://www.oracle-base.com/articles/misc/rank-dense-rank-first-last-analytic-functions.php#dense_rank),因为它确定重复': D' –
@JW。 - 如果OP想要包含电影名称,请发表评论。然而,由于OP只是希望体裁/最高排名,我认为ROW_NUMBER()的工作也是如此:)但好点。 – sgeddes
但你将如何处理这些记录?流派“,”10,1“,”11,2“,”11,3“,”12,4“。你将如何获得第二高的评价?你会只返回一个记录吗? –