मैं उस तालिका में सबसे हालिया प्रविष्टि पुनर्प्राप्त करने का प्रयास कर रहा हूं जो एक निश्चित घटना से पहले है। इस चिंता की मुख्य तालिका में उपयोगकर्ता के लिए एक आईडी है, जिस तरह की घटना हुई है और साथ ही टाइमस्टैम्प भी है।

यह वह जगह है जहाँ मैं इस समय हूँ:

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 के प्रत्येक संयोजन के लिए सबसे हाल ही में प्राप्त करने का एक तरीका ढूंढ रहा हूं।

0
Haris 26 जुलाई 2017, 18:19

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)
2
John Cappelletti 26 जुलाई 2017, 18:24

ऐसा करने का शायद सबसे आसान तरीका सीटीई और 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
1
Zohar Peled 26 जुलाई 2017, 18:24