1

我的 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

4 回答 4

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

于 2013-08-27T20:40:57.197 回答
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

于 2013-08-27T21:36:09.770 回答
0
Select mg_medianum 
from MediaGenT
  QUALIFY ROW_NUM() OVER (PARTITION BY mg_medianum Order by mg_createdate Desc)=1;
于 2013-08-27T20:44:22.873 回答
0

这只是每个组的最大 n 个查询。一种替代方案是 Gordon 提出的替代方案。另一种是使用左连接:

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 而异。

于 2013-08-27T20:48:30.483 回答