यह क्वेरी प्रत्येक पंक्ति के लिए मायने रखेगी:
SELECT allocation, d, count(*) OVER (PARTITION BY allocation, part ORDER BY d) AS c
FROM (
SELECT allocation, d,
d - row_number() OVER (PARTITION BY allocation ORDER BY d) AS part
FROM t
)
ORDER BY d;
फिर आप दी गई पंक्ति के लिए गणना खोजने के लिए उस पर फ़िल्टर कर सकते हैं:
SELECT c
FROM (
SELECT allocation, d, count(*) OVER (PARTITION BY allocation, part ORDER BY d) AS c
FROM (
SELECT allocation, d,
d - row_number() OVER (PARTITION BY allocation ORDER BY d) AS part
FROM t
)
)
WHERE d = DATE '2015-01-05';
स्पष्टीकरण:
व्युत्पन्न तालिका का उपयोग विभिन्न "विभाजन" की गणना करने के लिए किया जाता है part
प्रत्येक तिथि और आवंटन के लिए:
SELECT allocation, d,
d - row_number() OVER (PARTITION BY allocation ORDER BY d) AS part
FROM t
नतीजा यह है:
allocation d part
--------------------------------
Same 01.01.15 31.12.14
Good 02.01.15 01.01.15
Same 03.01.15 01.01.15
Same 04.01.15 01.01.15
Same 05.01.15 01.01.15
Good 06.01.15 04.01.15
part
. द्वारा निर्मित ठोस तिथि अप्रासंगिक है। यह केवल कुछ तारीख है जो आवंटन के भीतर तिथियों के प्रत्येक "समूह" के लिए समान होगी। फिर आप (allocation, part)
. के समान मानों की संख्या गिन सकते हैं count(*) over(...)
. का उपयोग करके विंडो फ़ंक्शन:
SELECT allocation, d, count(*) OVER (PARTITION BY allocation, part ORDER BY d) AS c
FROM (...)
ORDER BY d;
अपना वांछित परिणाम देने के लिए।
डेटा
मैंने उदाहरण के लिए निम्न तालिका का उपयोग किया है:
CREATE TABLE t AS (
SELECT DATE '2015-01-01' AS d, 'Same' AS allocation FROM dual UNION ALL
SELECT DATE '2015-01-02' AS d, 'Good' AS allocation FROM dual UNION ALL
SELECT DATE '2015-01-03' AS d, 'Same' AS allocation FROM dual UNION ALL
SELECT DATE '2015-01-04' AS d, 'Same' AS allocation FROM dual UNION ALL
SELECT DATE '2015-01-05' AS d, 'Same' AS allocation FROM dual UNION ALL
SELECT DATE '2015-01-06' AS d, 'Good' AS allocation FROM dual
);