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

Oracle SQL Loop melalui Rentang Tanggal

Berikut cara mendapatkan rentang tanggal:

 SELECT DATE'2015-01-01' + LEVEL - 1
   FROM dual
CONNECT BY DATE'2015-01-01' + LEVEL - 1 < DATE'2015-02-01';

Di atas akan mendapatkan semua tanggal dalam rentang 1 Januari 2015 hingga 31 Januari 2015.

Apa yang dapat Anda lakukan, menggunakan yang di atas, adalah memasukkan tanggal mulai dan berakhir dan membuat CTE, lalu menggunakan gabungan luar pada tanggal:

WITH dr AS (
    SELECT DATE'2015-01-01' + LEVEL - 1 AS transaction_date
      FROM dual
   CONNECT BY DATE'2015-01-01' + LEVEL - 1 < DATE'2015-01-04'
)
SELECT V.VISIT_ID, dr.transaction_date
     , P.NAME_LAST, ETT.ENC_TRANS_TYPE_NAME
...
       ENCOUNTER_TRANSACTION ET RIGHT JOIN dr
    ON ET.ENCOUNTER_TRANSACTION_DATE = dr.transaction_date

PERBARUI Saya punya waktu dan saya pikir saya melihat bagaimana hal di atas dapat diintegrasikan ke dalam kueri Anda. Saya tidak benar-benar memiliki data sampel untuk SQL Fiddle (Anda memiliki banyak tabel untuk itu). Di sinilah Anda dapat memulai, ini harus mendapatkan semua kunjungan yang sesuai ditambah setiap tanggal di sepanjang rentang tanggal kunjungan (dengan asumsi tidak ada kunjungan yang melebihi 30 hari - sesuaikan dengan itu):

WITH dr AS (
    SELECT LEVEL AS dd FROM dual
   CONNECT BY LEVEL <= 30 -- I'm assuming a max date range of 30; increase as you see fit
)
SELECT v.visit_id, v.start_date - 1 + dr.dd AS encounter_transaction_date
     , p.name_last, ett.enc_trans_type_name
  FROM visit v CROSS JOIN dr
 WHERE v.start_date - 1 + dr.dd < TRUNC(v.end_date) + 1
   AND v.institution_id = 1
   AND v.end_date IS NOT NULL
   AND v.voided_yn = 'N'
   AND v.care_setting_code = 'I'
   AND v.patient_team_id IN (16,17,18)
   AND v.start_date >= TRUNC(ADD_MONTHS(CURRENT_DATE, -1), 'MONTH')
   AND v.end_date < TRUNC(CURRENT_DATE, 'MONTH');

Maka saya pikir gabungan luar Anda harus LEFT JOIN dari sana (setidaknya, jika saya mengerti dengan benar yang mungkin tidak:

WITH dr AS (
    SELECT LEVEL AS dd FROM dual
   CONNECT BY LEVEL <= 30 -- I'm assuming a max date range of 30; increase as you see fit
)
SELECT v.visit_id, v.start_date - 1 + dr.dd AS encounter_transaction_date
  FROM visit v CROSS JOIN dr
  LEFT JOIN encounter_transaction et
    ON v.visit_id = et.visit_id
   AND v.institution_id = et.institution_id
   AND TRUNC(v.start_date - 1 + dr.dd) = et.encounter_transaction_date
  LEFT JOIN encounter_transaction_type ETT
    ON et.encounter_type_id = ett.encounter_transaction_type_id
  LEFT JOIN local_provider lp
    ON et.ordering_provider_id = lp.local_provider_id
  LEFT JOIN person_identifier i
    ON i.identifier = lp.provider_number
   AND i.identifier_sys_id = lp.provider_number_sys_id
   AND i.identifier IN (
       '1234', --Smith
       '4321' --Jones ** you had an extra comma here!
)
  LEFT JOIN person p
    ON p.person_id = i.person_id
 WHERE v.start_date - 1 + dr.dd < TRUNC(v.end_date) + 1
   AND v.institution_id = 1
   AND v.end_date IS NOT NULL
   AND v.voided_yn = 'N'
   AND v.care_setting_code = 'I'
   AND v.patient_team_id IN (16,17,18)
   AND v.start_date >= TRUNC(ADD_MONTHS(CURRENT_DATE, -1), 'MONTH')
   AND v.start_date < TRUNC(CURRENT_DATE, 'MONTH');



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Indeks Oracle dan jenis indeks di Oracle dengan contoh

  2. komponen skrip tidak memiliki referensi Oracle

  3. Kembalikan baris data dari blok pl/sql

  4. Fungsi Oracle Custom IsNumber dengan Presisi dan Skala

  5. Oracle - Ubah tabel yang ada untuk menambah kolom secara otomatis