Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle SQL цикъл през диапазон от дати

Ето как можете да получите набор от дати:

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

Горното ще получи всички дати в диапазона от 1 януари 2015 г. до 31 януари 2015 г.

Това, което бихте могли да направите, използвайки горното, е да включите началната и крайната си дата и да създадете CTE, след което да използвате външно свързване на датите:

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

АКТУАЛИЗАЦИЯ Имах малко време и мисля, че виждам как горното може да бъде интегрирано във вашето запитване. Всъщност нямам примерни данни за SQL Fiddle (и без това имате много таблици за това). Ето откъде можете да започнете, това трябва да получи всички подходящи посещения плюс всяка дата в диапазона от дати на посещението (ако приемем, че нито едно посещение не надвишава 30 дни - коригирайте това съответно):

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

Тогава мисля, че вашите външни съединения трябва да бъдат LEFT JOINs оттам (поне, ако разбирам правилно, което може и да не е:

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. Излиза ли буквално java.net.Inet6Address.getByName и вижте дали адресът съществува

  2. Извличане на МНОЖЕСТВО РЕДОВЕ и СЪХРАНЕНИЕ в 1 ПРОМЕНЛИВА - ORACLE СЪХРАНЯВАНА ПРОЦЕДУРА

  3. Как да променя формата на датата от ММ/ДД/ГГГГ на ГГГГ-ММ-ДД в PL/SQL?

  4. Как да направите Pivoting в Oracle 10g

  5. SQL синтаксис или ограничения на базата данни?