次の表を考えてみましょう。
Id(PK, int) | DocDate(long) | Sender(varchar) | Recipient(varchar) | PeriodStart(long) | PeriodEnd(long)
、 、ごとSenderにRecipient、異なる時点で複数のエントリを書いています。したがって、異なります。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
このクエリのパフォーマンスは低いと思われるかもしれませんが、クラスター化インデックスを使用するとパフォーマンスを向上させることができます。
しかし、この問題に対するより高速でエレガントな解決策がないかどうか疑問に思っています。誰でも提供できますか?