我正在使用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;
答案 0 :(得分:0)
您没有提到数据库系统。如果有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
其他数据库系统相似。 “混合”表称为“联接两个表”。您的语法非常古老。如果您的数据库系统支持,最好使用现代连接语法。
对于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
答案 1 :(得分:0)
这听起来像是PostgreSQL SELECT DISTINCT ON
查询:
SELECT
DISTINCT ON (titolo)
titolo, ano
ORDER BY titolo, ano;
缺点是它是PostgreSQL特定的扩展,它不能移植到其他数据库中。根据您的情况,这可能重要也可能不重要。
答案 2 :(得分:0)
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;
那是解决方案!