SQL查询中的独特子句

时间:2013-08-27 20:35:23

标签: sql greatest-n-per-group

我的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。我无法想出这种查询的语法。

4 个答案:

答案 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。