Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

किसी दिए गए मानदंड को पूरा करने वाले लगातार दिनों की गणना करें

यह क्वेरी प्रत्येक पंक्ति के लिए मायने रखेगी:

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
);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL डेवलपर में डेटाबेस का नाम कैसे क्वेरी करें?

  2. नियमित अभिव्यक्ति का उपयोग करके एकाधिक मिलान स्ट्रिंग कैसे प्राप्त करें

  3. ORA-00900:अमान्य SQL कथन- जब oracle 10g . में एक प्रक्रिया चलाते हैं

  4. Oracle क्वेरी:अल्पविराम से अलग किए गए मान वाले विभिन्न तालिका के दो स्तंभों की तुलना कैसे करें?

  5. डेटाग्रिप में सर्वर आउटपुट कैसे सेट करें