从表中逐个获取Max()记录

时间:2010-04-04 09:35:05

标签: sql linq group-by grouping

我有一张这样的桌子:

Article Number  Last Voucher Number Last Voucher Date
0557934         519048                  04/02/2005
0557934         519067                  04/02/2005
0557934         528630                  09/29/2005
0557934         528631                  09/29/2005
0557934         529374                  10/13/2005
0557934         529375                  10/13/2005
0557934         529471                  10/16/2005
0557934         529472                  10/16/2005
0557934         535306                  01/08/2006
0557934         535307                  01/08/2006
0557934         1106009                 08/10/2006
0557934         1106010                 08/10/2006
0022738         22554                   02/20/1995
0022738         22595                   03/12/1995
0022738         22597                   03/15/1995
0022738         22605                   03/19/1995
0022738         22616                   03/25/1995
0022738         22621                   03/28/1995
0022738         22630                   04/05/1995

我希望只有最后日期的记录:

Article Number  Last Voucher Number Last Voucher Date
0557934         1106010                 08/10/2006
0022738         22630                   04/05/1995

我可以直接在SQL或Linq上进行。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

最简单的方法可能是使用row_number。这也打破了同一凭证日期的关系:

select *
from (
    select 
        *
    ,   row_number() over (partition by [Article Number] 
          order by [Last Voucher Date] desc, [Last Voucher Number] desc) as RowNr
    from YourTable
) as SubQueryAlias
where RowNr = 1

另一个选项是where not exists子句:

select *
from YourTable yt
where not exists (
    select *
    from YourTable yt2
    where yt.[Article Number] = yt2.[Article Number]
    and yt.[Last Voucher Date] < yt2.[Last Voucher Date]
)

如果是最新凭证日期的关联,则会返回两行。

答案 1 :(得分:2)

您需要提取每篇文章的最后日期,然后重新加入以获取最后一个凭证编号。否则,您也会将最后一个凭证编号分组。

当然,这会为文章0557934返回2行,但同一日期的平局判断标准是什么? 这比我发现的使用ROW_NUMBER更常见,但YMMV.And ROW_NUMBER是你如何应对抢七局面

SELECT
    M.*
FROM
    (
    SELECT
        MAX([Last Voucher Date]) AS LastDate,
        [Article Number]
    FROM
        Mytable
    GROUP BY
        [Article Number]
    ) MMax
    JOIN MyTable M ON MMax.[Article Number] = M.[Article Number] AND MMax.LastDate = M.[Last Voucher Date]

答案 2 :(得分:0)

如果您使用的是Oracle,则可以执行以下操作:

select *
from 
  (select *
  from Table
  order by voucher_date)
where rownum = 1