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

データセット内の連続する日付のセットを効率的にクエリするにはどうすればよいですか?

    このようなクエリを実行する方法の例を次に示します。

    SQL> create table t (site_id,start_date,end_date)
      2  as
      3  select 1, date '2008-10-01', date '2008-10-02' from dual union all
      4  select 1, date '2008-10-02', date '2008-10-03' from dual union all
      5  select 1, date '2008-10-03', date '2008-10-30' from dual union all
      6  select 1, date '2008-10-30', date '2008-10-31' from dual union all
      7  select 2, date '2008-10-01', date '2008-10-02' from dual union all
      8  select 2, date '2008-10-02', date '2008-10-03' from dual union all
      9  select 2, date '2008-10-03', date '2008-10-04' from dual union all
     10  select 2, date '2008-10-04', date '2008-10-05' from dual union all
     11  select 2, date '2008-10-05', date '2008-10-06' from dual union all
     12  select 2, date '2008-10-06', date '2008-10-07' from dual union all
     13  select 2, date '2008-10-07', date '2008-10-08' from dual union all
     14  select 2, date '2008-10-08', date '2008-10-09' from dual union all
     15  select 2, date '2008-10-09', date '2008-10-10' from dual union all
     16  select 2, date '2008-10-10', date '2008-10-11' from dual union all
     17  select 2, date '2008-10-11', date '2008-10-12' from dual union all
     18  select 2, date '2008-10-12', date '2008-10-13' from dual union all
     19  select 2, date '2008-10-13', date '2008-10-14' from dual union all
     20  select 2, date '2008-10-14', date '2008-10-15' from dual union all
     21  select 2, date '2008-10-15', date '2008-10-16' from dual union all
     22  select 2, date '2008-10-16', date '2008-10-17' from dual union all
     23  select 2, date '2008-10-17', date '2008-10-18' from dual union all
     24  select 2, date '2008-10-18', date '2008-10-19' from dual union all
     25  select 2, date '2008-10-19', date '2008-10-20' from dual union all
     26  select 3, date '2008-10-01', date '2008-10-02' from dual union all
     27  select 3, date '2008-10-02', date '2008-10-03' from dual union all
     28  select 3, date '2008-10-03', date '2008-10-04' from dual union all
     29  select 3, date '2008-10-04', date '2008-10-05' from dual union all
     30  select 3, date '2008-10-05', date '2008-10-06' from dual union all
     31  select 3, date '2008-10-06', date '2008-10-07' from dual union all
     32  select 3, date '2008-10-07', date '2008-10-08' from dual union all
     33  select 3, date '2008-10-08', date '2008-10-09' from dual union all
     34  select 3, date '2008-10-09', date '2008-10-10' from dual union all
     35  select 3, date '2008-10-30', date '2008-10-31' from dual
     36  /
    
    Tabel is aangemaakt.
    

    そして、クエリ:

    SQL> select site_id
      2       , min(start_date) contiguous_start_date
      3       , max(end_date) contiguous_end_date
      4       , count(*) number_of_contiguous_records
      5    from ( select site_id
      6                , start_date
      7                , end_date
      8                , max(rn) over (partition by site_id order by start_date) maxrn
      9             from ( select site_id
     10                         , start_date
     11                         , end_date
     12                         , case lag(end_date) over (partition by site_id order by start_date)
     13                             when start_date then null
     14                             else rownum
     15                           end rn
     16                      from t
     17                  )
     18          )
     19   group by site_id
     20       , maxrn
     21   order by site_id
     22       , contiguous_start_date
     23  /
    

    そして結果:

       SITE_ID CONTIGUOUS_START_DA CONTIGUOUS_END_DATE NUMBER_OF_CONTIGUOUS_RECORDS
    ---------- ------------------- ------------------- ----------------------------
             1 01-10-2008 00:00:00 31-10-2008 00:00:00                            4
             2 01-10-2008 00:00:00 20-10-2008 00:00:00                           19
             3 01-10-2008 00:00:00 10-10-2008 00:00:00                            9
             3 30-10-2008 00:00:00 31-10-2008 00:00:00                            1
    
    4 rijen zijn geselecteerd.
    

    よろしく、ロブ。



    1. psql:致命的:役割に対して接続が多すぎます

    2. mysqlでデフォルトのサーバー文字セットを見つけるにはどうすればよいですか?

    3. MySQLでのREGEX_REPLACE()関数のしくみ

    4. SQLを使用してOracleデータベースからBLOBデータを挿入および取得する方法は何ですか?