Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Dapatkan hitungan hari berturut-turut yang memenuhi kriteria tertentu

Kueri ini akan menghasilkan jumlah untuk setiap baris:

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;

Anda kemudian dapat memfilternya untuk menemukan jumlah untuk baris tertentu:

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

Penjelasan:

Tabel turunan digunakan untuk menghitung berbagai "partisi" part untuk setiap tanggal dan alokasi:

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

Hasilnya adalah:

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

Tanggal konkret yang dihasilkan oleh part tidak relevan. Hanya beberapa tanggal yang akan sama untuk setiap "grup" tanggal dalam alokasi. Anda kemudian dapat menghitung jumlah nilai identik dari (allocation, part) menggunakan count(*) over(...) fungsi jendela:

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

untuk menghasilkan hasil yang Anda inginkan.

Data

Saya telah menggunakan tabel berikut sebagai contoh:

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. cara mengatur ulang kolom Identitas di Oracle

  2. Mengonversi string (atau kolom) yang dibatasi menjadi baris di Oracle menggunakan fungsi sistem yang telah ditentukan sebelumnya

  3. Bagaimana cara saya mengisi tanggal yang hilang berdasarkan grup di Oracle

  4. Program PL/SQL untuk Menghapus Catatan Dari Tabel

  5. gabungan batin implisit - apakah mereka sama?