Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle SQL Loop qua Phạm vi ngày

Đây là cách bạn có thể nhận được phạm vi ngày:

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

Trên đây sẽ lấy tất cả các ngày trong khoảng từ ngày 1 tháng 1 năm 2015 đến ngày 31 tháng 1 năm 2015.

Những gì bạn có thể làm, bằng cách sử dụng ở trên, là thêm ngày bắt đầu và ngày kết thúc của bạn và tạo CTE, sau đó sử dụng kết hợp bên ngoài vào các ngày:

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

CẬP NHẬT Tôi đã có một thời gian và tôi nghĩ rằng tôi thấy cách ở trên có thể được tích hợp vào truy vấn của bạn. Tôi thực sự không có dữ liệu mẫu cho SQL Fiddle (dù sao thì bạn cũng có rất nhiều bảng cho điều đó). Đây là nơi bạn có thể bắt đầu, điều này sẽ nhận được tất cả các lượt truy cập thích hợp cộng với mọi ngày dọc theo phạm vi ngày của lượt truy cập (giả sử không có lượt truy cập nào vượt quá 30 ngày - hãy điều chỉnh điều đó cho phù hợp):

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

Sau đó, tôi nghĩ rằng các liên kết bên ngoài của bạn nên là THAM GIA TRÁI từ đó (ít nhất, nếu tôi hiểu chính xác thì tôi có thể không:

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. Error System.Data.OracleClient yêu cầu phần mềm máy khách Oracle phiên bản 8.1.7 trở lên khi cài đặt thiết lập

  2. ký tự cho đến nay trong sql oracle

  3. Lỗi SQL:ORA-12712:tập ký tự mới phải là tập thay thế của tập ký tự cũ

  4. Thủ tục được lưu trữ với nhiều tham số IN

  5. Chuyển đổi sang datetime từ Oracle