【问题标题】:How to get record with earliest date per group如何获取每组最早日期的记录
【发布时间】:2015-12-10 23:20:25
【问题描述】:

我需要根据“ItemNo”列从下表中获取最早日期。

项目编号 PO_number 日期 110913 PO-8048 2015 年 9 月 15 日 110913 PO-8036 2015 年 9 月 30 日 110652 PO-1011 2015 年 10 月 19 日 110652 PO-1011 2015 年 10 月 10 日 110009 PO-1016 2015 年 7 月 1 日 110009 PO-1087 2015 年 6 月 20 日 110888 PO-7171 2015 年 4 月 1 日

您的查询结果应该是这样的。

项目编号 PO_number 日期 110913 PO-8048 2015 年 9 月 15 日 110652 PO-1011 2015 年 10 月 10 日 110009 PO-1087 2015 年 6 月 20 日 110888 PO-7171 2015 年 4 月 1 日

任何帮助将不胜感激。

【问题讨论】:

  • 您能告诉我们您使用的是什么查询吗?
  • 如果日期列的数据类型为日期,您可以选择....按日期列名排序

标签: sql-server-2008 greatest-n-per-group


【解决方案1】:

您可以采用几种不同的方法来解决这个问题,一种合理的方法是:

with min_rec as
(
    select  t.ItemNo, t.PO_number, t.Date, row_number() over(partition by t.ItemNo order by t.Date asc) as rn
    from    your_table t
)
select   m.ItemNo, m.PO_number, m.Date
from     min_rec m
where    m.rn = 1;

利用 CROSS APPLY 将是另一种同样有效的方法,尽管在这种特殊情况下它可能不会是一种性能更好的方法(尽管一如既往,这取决于):

select  distinct c.ItemNo, c.PO_number, c.Date
from    your_table t
cross apply (
    select top 1 i.ItemNo, i.PO_number, i.Date
    from   your_table i
    where  i.ItemNo = t.ItemNo
    order by i.Date asc) c;

当然,您可以简单地使用自连接子查询(我将跳过那个示例)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多