sql >> データベース >  >> RDS >> Oracle

日付範囲を介したOracleSQLループ

    さまざまな日付を取得する方法は次のとおりです。

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

    上記は、2015年1月1日から2015年1月31日までの範囲のすべての日付を取得します。

    上記を使用してできることは、開始日と終了日をプラグインして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');
    

    次に、外部結合はそこからの左結合である必要があると思います(少なくとも、正しく理解していれば、理解できないかもしれません:

    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. PL/SQLは「IN」句を使用して連結クエリを書き換えます

    2. GROUPBYを使用してSQLServerで文字列を連結するにはどうすればよいですか?

    3. 私は本当にmysqlインジェクションを理解していませんか?それは何ですか?

    4. エラー:JDBCを介してDDLとSELECTを混在させる場合、キャッシュされたプランは結果タイプを変更してはなりません