यह थोड़ा जटिल है। rank()
का उपयोग करने के बजाय या इसी तरह, lag()
. का उपयोग करें देखने के लिए जब कुछ बदलता है। फिर ध्वज का संचयी योग करें।
select dept, date1,
CASE WHEN StartFlag = 0 THEN 1
ELSE 1+StartFlag+NVL(lag(StartFlag) over (order by date1),0)
END as rnk
from (select t1.*,
(case when dept = lag(dept) over (order by date1)
then 1
else 0
end) as StartFlag
from t1
) t1
order by date1;
यहाँ SQLFiddle है।
संपादित करें:
यह गॉर्डन मेरा अपना उत्तर संपादित कर रहा है। उफ़। मूल प्रश्न वहां के रास्ते का 90% था। इसने समूहों . की पहचान की जहाँ संख्याएँ बढ़नी चाहिए, लेकिन समूहों के भीतर संख्याएँ निर्दिष्ट नहीं कीं। मैं इसे row_number()
. के दूसरे स्तर के साथ करूँगा के रूप में:
select dept, date1,
row_number() over (partition by dept, grp order by date1) as rnk
from (select dept, date1, startflag,
sum(StartFlag) over (partition by dept order by date1) as grp
from (select t1.*,
(case when dept = lag(dept) over (order by date1)
then 0
else 1
end) as StartFlag
from t1
) t1
) t1
order by date1;
तो, समग्र विचार निम्नलिखित है। सबसे पहले lag()
use का इस्तेमाल करें यह निर्धारित करने के लिए कि एक समूह कहाँ से शुरू होता है (अर्थात, जहाँ एक तिथि से दूसरी तिथि में विभाग परिवर्तन होता है)। फिर, संचयी योग करके इन्हें "समूह आईडी" असाइन करें। ये वे रिकॉर्ड हैं जिनकी गणना की जानी है। अंतिम चरण row_number()
. का उपयोग करके उनकी गणना करना है ।