我的SQL数据库中有一个名为MediaGenT的表,它有425000条记录。但是,列名mg_medianum具有重复的条目。例如,mg_medianum ='858'有10个不同的记录,但我只对最近可以按mg_createdate订购的记录感兴趣。
当我这样做时,我得到了425000条记录:
Select * from MediaGenT
Order By mg_createdate;
当我这样做时,我得到89000条记录(正确但只显示一列):
Select distinct mg_medianum from MediaGenT
Order by mg_createdate;
总结我需要的是一个查询,它显示89000记录的每一列只显示按mg_createdate排序的最新的不同mg_medianum。我无法想出这种查询的语法。
答案 0 :(得分:1)
您需要稍微复杂一点的查询:
select mgt.*
from MediaGenT mgt join
(select mg_medianum, max(mg_createdate) as maxcd
from MediaGenT
group by mg_medianum
) msum
on mgt.mg_medianum = msum.mg_medianum and mgt.mg_createdate = msum.maxcd;
即,计算每个媒体num的最近日期,然后选择该记录。
这是适用于任何数据库的标准SQL。
编辑:
上述查询正在计算每个媒体号码的最大日期并将其称为msum.maxcd
。该查询使用此查询仅选择每个媒体编号的最大日期(通过join
)。 mgt.*
表达式选择MediaGenT
表中的所有列。
答案 1 :(得分:1)
这个可能比Gordon的解决方案更快,因为只需要在桌面上进行一次扫描。
select mg_medianum, mg_createdate
from (
select mg_medianum,
mg_createdate,
max(mg_createdate) over (partition by mg_medianum) as max_created
from MediaGenT
) t
where mg_createdate = max_created;
这是ANSI SQL,适用于所有现代DBMS
答案 2 :(得分:0)
Select mg_medianum
from MediaGenT
QUALIFY ROW_NUM() OVER (PARTITION BY mg_medianum Order by mg_createdate Desc)=1;
答案 3 :(得分:0)
这只是一个最大的每组查询。一种替代方案是戈登提出的方案。另一个是使用左连接:
select t1.* from MediaGenT t1
left join MediaGenT t2 on
t1.mg_medianum = t2.mgmedianum and t1.mg_createdate < t2.mg_createdate
where t2.mg_createdate is null
两种查询的效率可能会有所不同,具体取决于表的数据分布和使用的DBMS。