sql >> Database >  >> RDS >> Oracle

Krijg het aantal opeenvolgende dagen dat aan een bepaald criterium voldoet

Deze zoekopdracht levert de tellingen voor elke rij op:

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;

U kunt er vervolgens op filteren om de tellingen voor een bepaalde rij te vinden:

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

Uitleg:

De afgeleide tabel wordt gebruikt om verschillende "partities" part te berekenen voor elke datum en toewijzing:

  SELECT allocation, d,
         d - row_number() OVER (PARTITION BY allocation ORDER BY d) AS part
  FROM t

Het resultaat is:

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

De concrete datum geproduceerd door part is niet relevant. Het is gewoon een datum die hetzelfde zal zijn voor elke "groep" datums binnen een toewijzing. U kunt dan het aantal identieke waarden van (allocation, part) . tellen met behulp van de count(*) over(...) vensterfunctie:

SELECT allocation, d, count(*) OVER (PARTITION BY allocation, part ORDER BY d) AS c
FROM (...)
ORDER BY d;

om het gewenste resultaat te produceren.

Gegevens

Ik heb de volgende tabel als voorbeeld gebruikt:

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. MySQL-zoekopdracht voor door komma's gescheiden naam

  2. Wat betekent een dubbele punt voor een letterlijke in een SQL-instructie?

  3. Hoe kan ik een COUNT (col) ... GROUP BY krijgen om een ​​index te gebruiken?

  4. ORACLE 10g :To_date() Geen geldige maand