我使用的是Pgadmin(mysql).我必须打印一个名字的日期(第一年),所以我的代码给我这个。
"El padrino";1972
"El padrino";1972
"El padrino";1972
"El resplandor";1980
"El resplandor";1981
"Buenos muchachos";1990
"Buenos muchachos";1990
"Forrest Gump";1994
"Forrest Gump";1994
"Tiempos violentos";1994
"Tiempos violentos";1995
"Los 7 pecados capitales";1995
我需要把每部电影的名字与最古老的年份。像这样。
"El padrino";1972
"El resplandor";1980
"Buenos muchachos";1990
"Forrest Gump";1994
"Tiempos violentos";1994
"Los 7 pecados capitales";1995
我正在尝试用下面的代码:
SELECT min(titulo), MIN(EXTRACT(YEAR from f.fecha))
FROM pelicula p, f_estreno_pais f
WHERE p.id_pelicula = f.id_pelicula
GROUP BY p.id_pelicula, f.fecha
ORDER BY f.fecha;
你没有提到你的数据库系统。如果有windwos函数,这将是一种方式。
准备一个普通的表表达式(cte)。你的表有列 "titulo "和 "fecha"。将它们按 "titulo "的 "fecha "编号,并从你的cte中取第一个数字。
对于SQL-Server来说,语法是这样的
;with my_cte as (
select
titulo,
fecha,
row_number() over (partition by titulo order by fecha) n
from your_table
)
select *
from my_cte
where n = 1
其他数据库系统也类似。"混合 "表叫做 "连接两个表"。你的语法是非常老派的。如果你的数据库系统支持,你最好使用现代的join语法。
对于SQL-Server 2016来说,这将是一个完整的运行示例,什么会给你预期的结果。
drop table if exists #t1
create table #t1 (titulo varchar(255), fecha int)
insert #t1 values
('El padrino',1972),
('El padrino',1972),
('El resplandor',1980),
('El resplandor',1981),
('Buenos muchachos',1990),
('Buenos muchachos',1990),
('Forrest Gump',1994),
('Forrest Gump',1994),
('Tiempos violentos',1994),
('Tiempos violentos',1995),
('Los 7 pecados capitales',1995)
;with my_cte as (
select
titulo,
fecha,
row_number() over (partition by titulo order by fecha) n
from #t1
)
select *
from my_cte
where n = 1
order by 1
这听起来就像PostgreSQL的 SELECT DISTINCT ON
查询。
SELECT
DISTINCT ON (titolo)
titolo, ano
ORDER BY titolo, ano;
这个的缺点是它是PostgreSQL专用的扩展,它不能移植到其他数据库中;根据你的情况,这可能或不重要。
SELECT min(p.titulo), MIN(EXTRACT(YEAR from f.fecha)) min_fecha
FROM pelicula p
INNER JOIN f_estreno_pais f ON p.id_pelicula = f.id_pelicula
GROUP BY p.id_pelicula
ORDER BY min_fecha;
这就是解决方案!