【发布时间】:2020-08-09 09:21:40
【问题描述】:
我正在选择一个年份(硬编码为下面的 1981),我希望每个合格的乐队都有一个行。主要问题是为每个乐队找到最年长的在世成员:
SELECT b.id_band,
COUNT(DISTINCT a.id_album),
COUNT(DISTINCT s.id_song),
COUNT(DISTINCT m.id_musician),
(SELECT name FROM MUSICIAN WHERE year_death IS NULL ORDER BY(birth)LIMIT 1)
FROM BAND b
LEFT JOIN ALBUM a ON(b.id_band = a.id_band)
LEFT JOIN SONG s ON(a.id_album = s.id_album)
JOIN MEMBER m ON(b.id_band= m.id_band)
JOIN MUSICIAN mu ON(m.id_musician = mu.id_musician)
/*LEFT JOIN(SELECT name FROM MUSICIAN WHERE year_death IS NULL
ORDER BY(birth) LIMIT 1) AS alive FROM mu*/ -- ??
WHERE b.year_formed = 1981
GROUP BY b.id_band;
我想为每个乐队从mu 获取最年长的在世成员。但我只是从关系MUSICIAN 中得到了最年长的音乐家。
这是显示我当前查询的输出的屏幕截图:
【问题讨论】:
-
如果你想从每个乐队中获得最年长的成员,你可以使用
window function。 -
您的设计是否允许同一首歌 (
id_song) 在一张专辑或同一乐队的多张专辑中多次出现?如果没有,这可以更快......另外,是否有没有歌曲的专辑/没有专辑的乐队/没有成员?请(始终)声明您的 Postgres 版本。
标签: sql postgresql left-join distinct greatest-n-per-group