sql >> Databáze >  >> RDS >> Oracle

Získejte počet po sobě jdoucích dnů splňujících daná kritéria

Tento dotaz poskytne počty pro každý řádek:

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;

Poté jej můžete filtrovat a najít počty pro daný řádek:

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

Vysvětlení:

Odvozená tabulka se používá k výpočtu různých "oddílů" part pro každé datum a přidělení:

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

Výsledek je:

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

Konkrétní datum vytvořené part je irelevantní. Je to jen nějaké datum, které bude stejné pro každou "skupinu" dat v rámci alokace. Poté můžete spočítat počet identických hodnot (allocation, part) pomocí count(*) over(...) funkce okna:

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

k dosažení požadovaného výsledku.

Data

Pro příklad jsem použil následující tabulku:

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. Dávkové provádění JDBC je extrémně pomalé

  2. Oprava Msg 8114 „Chyba při převodu datového typu varchar na číselný“ v SQL Server

  3. jak použít lajk s připojením v SQL?

  4. Jak používat OBJECT_ID() na mezidatabázových objektech na serveru SQL Server