2017-07-26 7 views
0

特定のイベントを過ぎたテーブルの最新のエントリを取得しようとしています。この主なテーブルには、ユーザーのID、発生したイベントの種類、タイムスタンプが含まれています。テーブル内の直前のエントリを取得しようとしています

これはどこ私は現在でいますされています(個々のイベントのためのdupesは、私が想定していないが)

SELECT cc.RefNo 
    ,cc.Subcase 
    ,ev.EventDate 
    ,evt.EventCode 
    ,ev.Amount 
    ,previousevent.EventCode as [previous Event] 
    ,previousevent.previousdate as [date previous event] 
    FROM event ev JOIN EventTemplate evt ON ev.EventTemplateID = evt.ID 
    JOIN CCase cc ON cc.ID = ev.CCaseID 
    JOIN (SELECT MAX(ev.EventDate) as previousdate, evt.EventCode, CCaseID 
          FROM Event ev JOIN EventTemplate evt ON ev.EventTemplateID = evt.ID 
          WHERE (evt.EventCode LIKE 'SI%' OR evt.EventCode LIKE 'SM%') 
          Group by CCaseID, evt.EventCode) as previousevent 
    ON previousevent.CCaseID = cc.ID 
    AND previousevent.previousdate < ev.EventDate 

このため、出力は私の以前のすべてのイベントを与えています。私は今、RefNo、Subcase、EventDate、EventCodeの組み合わせごとに最新のものに到達する方法を探しています。

+1

は素晴らしいです始める場所。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

[SQL - 指定された日付の前に見つかった最初のレコードの選択可能な複製](https://stackoverflow.com/questions/10839350/sql-selecting-the-first-record-found-before-a-given-date) –

答えて

2

テストされていないが、おそらくRow_Number()と協力しWITH TIES句はここ

SELECT Top 1 with ties 
     cc.RefNo 
     ,cc.Subcase 
     ,ev.EventDate 
     ,evt.EventCode 
     ,ev.Amount 
     ,previousevent.EventCode as [previous Event] 
     ,previousevent.previousdate as [date previous event] 
    FROM event ev JOIN EventTemplate evt ON ev.EventTemplateID = evt.ID 
    JOIN CCase cc ON cc.ID = ev.CCaseID 
    JOIN (SELECT MAX(ev.EventDate) as previousdate, evt.EventCode, CCaseID 
          FROM Event ev JOIN EventTemplate evt ON ev.EventTemplateID = evt.ID 
          WHERE (evt.EventCode LIKE 'SI%' OR evt.EventCode LIKE 'SM%') 
          Group by CCaseID, evt.EventCode) as previousevent 
    ON previousevent.CCaseID = cc.ID 
    AND previousevent.previousdate < ev.EventDate 
    Order By Row_Number() over (Partition By RefNo, Subcase, EventCode Order By EventDate Desc) 
+0

私はそれがうまくいくはずだと思います、もしそうなら、それはもっと簡単です答え... –

+0

@ZoharPeled事実上同じことです。余分なフィールドがないので、WITH TIESが好きです。しかし、TOP(1 + n)はややこしいです。 –

+0

このソリューションはうまくいきました!私はRow_Number()で(RegNo、Subcase、evt.EventCode順に並べ替える)Order to Row_Number()を(RegNo、Subcase、EventDate Descでevt.EventCode順に) ) 'しかし、結果はすべて良く見える。 – Haris

1

役立つ可能性がおそらくそれを行うための最も簡単な方法は、CTEとROW_NUMBERである:ここでは

;WITH CTE AS 
(
    SELECT cc.RefNo 
     ,cc.Subcase 
     ,ev.EventDate 
     ,evt.EventCode 
     ,ev.Amount 
     ,previousevent.EventCode as [previous Event] 
     ,previousevent.previousdate as [date previous event] 
     , ROW_NUMBER() OVER (PARTITION BY cc.RefNo ,cc.Subcase ,ev.EventDate, evt.EventCode ORDER BY previousevent.previousdate DESC) AS rn 
     FROM event ev JOIN EventTemplate evt ON ev.EventTemplateID = evt.ID 
     JOIN CCase cc ON cc.ID = ev.CCaseID 
     JOIN (SELECT MAX(ev.EventDate) as previousdate, evt.EventCode, CCaseID 
           FROM Event ev JOIN EventTemplate evt ON ev.EventTemplateID = evt.ID 
           WHERE (evt.EventCode LIKE 'SI%' OR evt.EventCode LIKE 'SM%') 
           Group by CCaseID, evt.EventCode) as previousevent 
     ON previousevent.CCaseID = cc.ID 
     AND previousevent.previousdate < ev.EventDate 
) 

SELECT cc.RefNo 
     ,cc.Subcase 
     ,ev.EventDate 
     ,evt.EventCode 
     ,ev.Amount 
     ,previousevent.EventCode as [previous Event] 
     ,previousevent.previousdate as [date previous event] 
FROM CTE 
WHERE rn = 1 
関連する問題