You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:37:30