sql >> Databasteknik >  >> RDS >> Oracle

Få räkning av på varandra följande dagar som uppfyller ett givet kriterium

Denna fråga kommer att ge antalet för varje rad:

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;

Du kan sedan filtrera på den för att hitta antalet för en given rad:

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

Förklaring:

Den härledda tabellen används för att beräkna olika "partitioner" part för varje datum och tilldelning:

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

Resultatet är:

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

Det konkreta datumet producerat av part är irrelevant. Det är bara ett datum som kommer att vara detsamma för varje "grupp" av datum inom en tilldelning. Du kan sedan räkna antalet identiska värden för (allocation, part) med count(*) over(...) fönsterfunktion:

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

för att producera ditt önskade resultat.

Data

Jag har använt följande tabell för exemplet:

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. node.js mysql pool börjarTransaktion och anslutning

  2. Sortera efter datum och tid i fallande ordning?

  3. MySQL sa:Dokumentation #1045 - Åtkomst nekad för användaren 'root'@'localhost' (med lösenord:NEJ)

  4. Radnumrering med p:dataTable