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:Използване на подзаявка в тригер

  2. XMLType в Oracle не генерира тагове за колони с нулеви стойности

  3. Oracle база данни TNS Дължината на стойността за ключ „източник на данни“ надвишава ограничението си от „128“

  4. Защо заявката на Oracle 12c изисква двойни кавички около таблицата

  5. REGEXP_INSTR() Функция в Oracle