如何用SELECT获取每部电影最早上映年的对应标题(PgAdmin)
解决方法:获取每部电影的最早上映年份记录
你的问题核心在于GROUP BY子句错误地包含了上映日期f.fecha,这会把同一部电影的每个不同上映日期都单独分组,导致结果出现重复行。下面是两种可行的解决方案:
方案1:直接按电影分组聚合(最简方式)
这个方法直接通过分组提取每部电影的标题和最早年份,完全匹配你的期望输出:
SELECT p.titulo, MIN(EXTRACT(YEAR FROM f.fecha)) AS anio_estreno FROM pelicula p INNER JOIN f_estreno_pais f ON p.id_pelicula = f.id_pelicula GROUP BY p.id_pelicula, p.titulo ORDER BY anio_estreno;
关键说明:
- 仅按电影的唯一标识
p.id_pelicula和标题p.titulo分组(同一id_pelicula对应唯一标题,添加p.titulo是为了兼容严格SQL模式的要求)。 MIN(EXTRACT(YEAR FROM f.fecha))会自动提取该电影的最早上映年份。- 最终按年份排序,和你期望的结果顺序一致。
方案2:用窗口函数获取完整的最早上映记录
如果你后续需要用到最早上映的具体日期(而不只是年份),可以用窗口函数ROW_NUMBER()精准定位每部电影的第一条上映记录:
SELECT titulo, EXTRACT(YEAR FROM fecha) AS anio_estreno FROM ( SELECT p.titulo, f.fecha, -- 给每部电影的上映记录按日期升序编号,最早的记录编号为1 ROW_NUMBER() OVER (PARTITION BY p.id_pelicula ORDER BY f.fecha ASC) AS rn FROM pelicula p INNER JOIN f_estreno_pais f ON p.id_pelicula = f.id_pelicula ) AS subquery WHERE rn = 1 -- 只保留每部电影的最早上映记录 ORDER BY anio_estreno;
关键说明:
- 子查询通过
PARTITION BY p.id_pelicula把数据按电影拆分,ORDER BY f.fecha ASC确保最早的日期排在最前面。 - 外层筛选编号为1的记录,就是每部电影的首次上映记录。
为什么你原来的SQL会失败?
你之前的语句GROUP BY p.id_pelicula, f.fecha会把同一电影的每个不同上映日期都作为独立分组,哪怕是同一年的不同日期,也会生成多条重复的标题+年份记录,这就是结果出现重复行的原因。
内容的提问来源于stack exchange,提问作者Ángel
相关产品推荐
相关产品推荐

