2


1

グループごとにテーブルからMax()レコードを取得する

私はそのようなテーブルを持っています:

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で直接実行できます。

何か案が?

Ju

3 Answer


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]
)

最新のバウチャー日付が同点の場合、これは両方の行を返します。


2


記事ごとに最後の日付を抽出し、最後に参加して最後のバウチャー番号を取得する必要があります。 それ以外の場合は、最後のバウチャー番号にもグループ化します。

もちろん、これは記事0557934に対して2行を返しますが、同じ日付のタイブレーク基準は何ですか? これは、私が見つけたROW_NUMBERを使用するよりも頻繁に実行されますが、YMMVと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]


0


Oracleを使用している場合は、次のようにします。

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