मुझे लगता है कि मूल रूप से वही विचार है जो पहले के प्रश्न में था। आप किसी दिए गए रिकॉर्ड से पहले किए गए रिकॉर्ड की संख्या को सख्ती से गिनना चाहते हैं। यह आपको एक समूह पहचानकर्ता देता है जिसे बाद में एकत्रीकरण के लिए उपयोग किया जा सकता है।
SQL सर्वर 2012+ में, आप संचयी योग कार्यक्षमता का उपयोग करेंगे। पुराने संस्करणों में, आप सहसंबद्ध सबक्वेरी या बाहरी आवेदन के साथ भी ऐसा ही कर सकते हैं।
यह संस्करण आपके उपरोक्त को कई तरह से संशोधित करता है। विशेष रूप से, यह grp
. को परिभाषित करने के तर्क को सरल करता है . मैं आसानी से नहीं देखता कि कैसे row_number()
क्वेरी में फिट बैठता है। मैं तर्क को समझता हूं - किए गए कार्यों की गणना करता हूं और एकत्रीकरण के लिए इसका उपयोग करता हूं। लेकिन, समूह में सभी पंक्तियों पर वह मान प्राप्त करना गैर-तुच्छ है।
SELECT r.Key, a.CYCLE_BEGIN_DATE, a.CYCLE_END_DATE, a.NUM_ACTIONS_IN_CYCLE
FROM Records r LEFT OUTER JOIN
(select a.key, a2.grp, min(Date) as CYCLE_BEGIN_DATE,
max(case when Action = 'Done') then Date end) as CYCLE_END_DATE,
count(*) as NUM_ACTIONS_IN_CYCLE
from actions a outer apply
(select count(*) as grp
from actions a2
where a2.key = a.key and a2.date < a.date and a2.action = 'Done'
) a2
group by a.key, a2.grp
) a
on r.key = a.key;