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

hitung jumlah baris yang muncul untuk setiap tanggal dalam rentang tanggal kolom

WITH    q AS
        (
        SELECT  (
                SELECT  MIN(start_date)
                FROM    mytable
                ) + level - 1 AS mydate
        FROM    dual
        CONNECT BY
                level <= (
                SELECT  MAX(end_date) - MIN(start_date)
                FROM    mytable
                )
        )
SELECT  group, mydate,
        (
        SELECT  COUNT(*)
        FROM    mytable mi
        WHERE   mi.group = mo.group
                AND q BETWEEN mi.start_date AND mi.end_date
        ) 
FROM    q
CROSS JOIN
        (
        SELECT  DISTINCT group
        FROM    mytable
        ) mo

Pembaruan:

Kueri yang lebih baik dan lebih cepat menggunakan fungsi analitik.

Ide utamanya adalah bahwa jumlah rentang yang berisi setiap tanggal adalah selisih sebelum penghitungan rentang dimulai sebelum tanggal tersebut dan jumlah rentang yang berakhir sebelum tanggal tersebut.

SELECT  cur_date,
        grouper,
        SUM(COALESCE(scnt, 0) - COALESCE(ecnt, 0)) OVER (PARTITION BY grouper ORDER BY cur_date) AS ranges
FROM    (
        SELECT  (
                SELECT  MIN(start_date)
                FROM    t_range
                ) + level - 1 AS cur_date
        FROM    dual
        CONNECT BY
                level <=
                (
                SELECT  MAX(end_date)
                FROM    t_range
                ) -
                (
                SELECT  MIN(start_date)
                FROM    t_range
                ) + 1
        ) dates
CROSS JOIN
        (
        SELECT  DISTINCT grouper AS grouper
        FROM    t_range
        ) groups
LEFT JOIN
        (
        SELECT  grouper AS sgrp, start_date, COUNT(*) AS scnt
        FROM    t_range
        GROUP BY
                grouper, start_date
        ) starts
ON      sgrp = grouper
        AND start_date = cur_date
LEFT JOIN
        (
        SELECT  grouper AS egrp, end_date, COUNT(*) AS ecnt
        FROM    t_range
        GROUP BY
                grouper, end_date
        ) ends
ON      egrp = grouper
        AND end_date = cur_date - 1
ORDER BY
        grouper, cur_date

Kueri ini selesai dalam 1 kedua di 1,000,000 baris.

Lihat entri ini di blog saya untuk detail lebih lanjut:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. File Respons Pembuatan Otomatis

  2. Apa cara elegan untuk mengembalikan 'ukuran file' yang dapat dibaca dari file yang disimpan dalam kolom gumpalan Oracle menggunakan SQL?

  3. Dinilai dimasukkan dalam tabel di Oracle tidak disimpan?

  4. Contoh database Oracle SQL

  5. Bagaimana cara mengirim parameter arbitrer ke pemicu Oracle?