SQL学校作业,写一个SELECT其中returns
SQL School Homework, write a SELECT which returns
写一张SELECT,其中returns每个乐队第五张专辑的名字。如果乐队没有第五张专辑,上面应该什么都没有。如果乐队在一年内有更多专辑,则按专辑名称的字典顺序排列。结果应包括乐队名称和专辑名称,按照乐队名称升序(从 A 到 Z)的字典顺序排列。
我的解决方案不正确,因为我不能用NULL值填充第五张专辑。
SELECT brand_name, album_name
FROM (
SELECT b.name AS brand_name, a.name AS album_name,
ROW_NUMBER() OVER(PARTITION BY b.name ORDER BY a.release_year) AS rank
FROM bands AS b
JOIN albums AS a ON a.band_id = b.id
) tmp
WHERE rank = 5
我的结果:
正确结果:
您应该在子查询中对相册进行排名,然后在外部查询中 left join
:
SELECT b.name brand_name, a.name album_name
FROM bands b
LEFT JOIN (
SELECT
band_id,
name,
ROW_NUMBER() OVER(PARTITION BY band_id ORDER BY release_year) AS rn
FROM albums
) a ON a.band_id = b.id AND a.rn = 5
写一张SELECT,其中returns每个乐队第五张专辑的名字。如果乐队没有第五张专辑,上面应该什么都没有。如果乐队在一年内有更多专辑,则按专辑名称的字典顺序排列。结果应包括乐队名称和专辑名称,按照乐队名称升序(从 A 到 Z)的字典顺序排列。
我的解决方案不正确,因为我不能用NULL值填充第五张专辑。
SELECT brand_name, album_name
FROM (
SELECT b.name AS brand_name, a.name AS album_name,
ROW_NUMBER() OVER(PARTITION BY b.name ORDER BY a.release_year) AS rank
FROM bands AS b
JOIN albums AS a ON a.band_id = b.id
) tmp
WHERE rank = 5
我的结果:
您应该在子查询中对相册进行排名,然后在外部查询中 left join
:
SELECT b.name brand_name, a.name album_name
FROM bands b
LEFT JOIN (
SELECT
band_id,
name,
ROW_NUMBER() OVER(PARTITION BY band_id ORDER BY release_year) AS rn
FROM albums
) a ON a.band_id = b.id AND a.rn = 5