0

次の表を考えてみましょう。

Id(PK, int) | DocDate(long) | Sender(varchar) | Recipient(varchar) | PeriodStart(long) | PeriodEnd(long)

、 、ごとSenderRecipient、異なる時点で複数のエントリを書いています。したがって、異なります。PerdiodStartPeriodEndDocDate

ここで、最新DocDateの foreachSenderのID を選択する必要があります。私が自分で見つけた唯一の解決策は、CTE を使用することです。RecipientPeriodStartPerdiodEnd

with prevFilter as (
    select   max(DocDate), Sender, Recipient, PeriodStart, PeriodEnd
    from     Table
    group
    by       Sender, Recipient, PeriodStart, PeriodEnd
)
select   Id
from     Table t
inner
join     prevFilter pf
         on  pf.DocDate = t.DocDate 
         and pf.Sender = t.Sender 
         and pf.Recipient = t.Recipient
         and pf.PeriodStart = t.PeriodStart
         and pf.PeriodEnd = t.PeriodEnd

このクエリのパフォーマンスは低いと思われるかもしれませんが、クラスター化インデックスを使用するとパフォーマンスを向上させることができます。

しかし、この問題に対するより高速でエレガントな解決策がないかどうか疑問に思っています。誰でも提供できますか?

4

4 に答える 4

4

CTE と を使用できますROW_NUMBER

with prevFilter as (
    select   Id, 
             RN = ROW_NUMBER() OVER(PARTITION BY Sender, Recipient, PerdiodStart, PeriodEnd
                                    ORDER BY DocDate DESC)
    from     Table
)
select   Id
from     prevFilter t
where RN = 1
于 2013-06-07T13:29:14.037 に答える
1

DocDateSQL Server ランキング関数を使用して、次の組み合わせごとに最高のレコードを分離しSender,Recipient, PeriodStart, PeriodEnd、フィルター処理することができます。

Select * from (
select  *, row_number() over (partition by Sender, 
                             Recipient, PeriodStart, PeriodEnd
      order by DocDate desc) as ranker
from     Table
) where ranker = 1
于 2013-06-07T13:30:15.923 に答える