我有一个音乐数据库的“相册”模式。
此架构包括属性:名称,艺术家,评级和年份。
我正在尝试创建一个查询,这样我就可以获得所有专辑的名称,这些专辑的评分高于同一个人的每张专辑。我需要检查数据库中的每个元组,并比较艺术家相同的元组,以及一张专辑的年份大于另一年的年份,并比较评级。
我尝试过使用不同策略的一些不同的东西。我目前的尝试是嵌套查询:
SELECT A1.Title
FROM Album A1
WHERE A1.Title NOT IN (SELECT A2.Title
FROM Album A2
WHERE A1.Artist = A2.Artist, A1.Year > A2.Year, A1.Rating > A2.Rating);
这显然不起作用(因此我的问题) - 我哪里错了?我认为一个相关的查询(像这一个)检查表中的每个元组与子查询?关于如何进行此查询的任何许可都表示赞赏。我是SQL的新手。
答案 0 :(得分:1)
我会使用窗口函数:
select a.*
from (select a.*,
max(a.rating) over (partition by a.artist
order by a.year
range between unbounded preceding and 1 preceding
) as prev_max_rating
from album a
) a
where rating > prev_max_rating;
答案 1 :(得分:1)
(在用AND
替换逗号之后)NOT EXISTS(...)
与NOT IN(...)
类似,但如果涉及NULL则表现更好。
SELECT A1.Title
FROM Album A1
-- There should not exist an older album with a higher rating
-- (for the same artist)
WHERE NOT EXISTS (SELECT *
FROM Album A2
WHERE A2.Artist = A1.Artist
AND A2.Year < A1.Year
AND A2.Rating > A1.Rating -- Note: the sign is flipped, compared to the query in the question
);