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 के बीच प्राप्त होंगी।

उपरोक्त का उपयोग करके आप क्या कर सकते हैं, अपनी शुरुआत और समाप्ति तिथियों में प्लग इन करें और सीटीई बनाएं, फिर तारीखों पर बाहरी जुड़ाव का उपयोग करें:

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

तब मुझे लगता है कि आपके बाहरी जोड़ वहां से बाएं शामिल होने चाहिए (कम से कम, अगर मैं सही ढंग से समझता हूं जो मैं नहीं कर सकता:

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. निर्माण प्रक्रिया के बाद cmake में अतिरिक्त स्रोत फ़ाइलों को कैसे संकलित करें?

  2. LOB कॉलम से डेटा को लॉन्ग रॉ कॉलम में कॉपी करना

  3. लिक्विबेस अद्यतन त्रुटि

  4. दो स्कीमा की तुलना करें और पुराने स्कीमा को नए स्कीमा के नए कॉलम के साथ अपडेट करें

  5. हाइबरनेट के साथ Oracle दिनांक का उपयोग करते समय दिनांक/समय के लिए जावा प्रकार