【问题标题】:Get Max() record from table by group按组从表中获取 Max() 记录
【发布时间】:2010-04-04 09:35:05
【问题描述】:

我有一张这样的桌子:

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 上执行。

有什么想法吗?

【问题讨论】:

    标签: sql linq group-by grouping


    【解决方案1】:

    最简单的方法可能是使用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]
    )
    

    如果最新凭证日期相同,这将返回两行。

    【讨论】:

    • 第二条语句运行良好,对我来说更好,因为我不想使用分组语句,因为它在我的数据库中需要很长时间。朱
    【解决方案2】:

    您需要提取每篇文章的最后日期,然后返回以获取 Last Voucher Number。否则,您也会按 Last Voucher Number 分组。

    当然,这会为文章 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]
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我在 Advantage Database 上,所以我没有 rownum...谢谢
      猜你喜欢
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 2018-06-24
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 2020-08-22
      相关资源
      最近更新 更多