2017-09-19 17 views
2

以下のサンプルデータでは、同じレートでレコードをグループ化しようとしています。日付による連続レコードをグループ化するためのOracle SQLクエリ

id start_date    end_date    rate 
    ----------------------------------------------------------------- 

    1 01/01/2017 12:00:00 am 01/01/2017 12:00:00 am 300 
    1 02/01/2017 12:00:00 am 02/01/2017 12:00:00 am 300 
    1 03/01/2017 12:00:00 am 03/01/2017 12:00:00 am 300 
    1 04/01/2017 12:00:00 am 04/01/2017 12:00:00 am 1000 
    1 05/01/2017 12:00:00 am 05/01/2017 12:00:00 am 500 
    1 06/01/2017 12:00:00 am 06/01/2017 12:00:00 am 500 
    1 07/01/2017 12:00:00 am 07/01/2017 12:00:00 am 1000 
    1 08/01/2017 12:00:00 am 08/01/2017 12:00:00 am 1000 
    1 09/01/2017 12:00:00 am 09/01/2017 12:00:00 am 300 

私が試したもの:

select distinct id, mn_date, mx_date,rate 
from (
    select id, min(start_date) over (partition by grp order by start_date) mn_date, 
    max(end_date) over(partition by grp order by start_date desc) mx_date, rate 
    from (
    select t.*, row_number() over(partition by id order by start_date) -row_number() over(partition by rate order by start_date)grp 
    from t 
     ) 
    ) 
order by mn_date; 

出力:

id mn_date     mx_date     rate 
-------------------------------------------------------- 
1 01/01/2017 12:00:00 am 03/01/2017 12:00:00 am 300 
1 04/01/2017 12:00:00 am 04/01/2017 12:00:00 am 1000 
1 05/01/2017 12:00:00 am 06/01/2017 12:00:00 am 500 
1 07/01/2017 12:00:00 am 09/01/2017 12:00:00 am 300 
1 07/01/2017 12:00:00 am 09/01/2017 12:00:00 am 1000 

所望の出力:(おかげ:連続した日付でグループへ

id mn_date     mx_date     rate 
-------------------------------------------------------- 
1 01/01/2017 12:00:00 am 03/01/2017 12:00:00 am 300 
1 04/01/2017 12:00:00 am 04/01/2017 12:00:00 am 1000 
1 05/01/2017 12:00:00 am 06/01/2017 12:00:00 am 500 
1 07/01/2017 12:00:00 am 08/01/2017 12:00:00 am 1000 
1 09/01/2017 12:00:00 am 09/01/2017 12:00:00 am 300 

決勝結果ゴードン)

私たちは、あなたが行番号のアプローチの違いを使用することができ、(すなわち、ギャップがない)は、隣接するレコードを識別するために start_dateを使用することができますと仮定
select id, min(start_date), max(end_date), rate 
from (
select id, start_date, end_date, rate, seqnum_i-seqnum_ir grp, sum(x) over(partition by id order by start_date) grp1 
from (
select t.*, 
      row_number() over (partition by id order by start_date) as seqnum_i, 
      row_number() over (partition by id, rate order by start_date) as seqnum_ir, 
      case when LEAD(start_date) over (partition by id order by start_date)= end_date + 1 
      then 0 
      else 1 
      end x 
from t 
) 
) 
group by id, grp+grp1, rate 
order by min(start_date); 
+0

どのようにデータをグループ化しますか?出力と希望出力の違いは何ですか?あなたは何を試しましたか? –

答えて

0

:これはどのように動作するかを確認するには

select id, min(start_date) as mn_date, max(end_date) as mx_date, rate 
from (select t.*, 
      row_number() over (partition by id order by start_date) as seqnum_i, 
      row_number() over (partition by id, rate order by start_date) as seqnum_ir 
     from t 
    ) t 
group by id (seqnum_i - seqnum_ir), rate; 

を、サブクエリの結果を見てください。 2つの行番号の違いによって、同じレートで隣接するレコードのグループがどのように定義されるかを「見る」ことができるはずです。

+0

ありがとうございましたGordon :)、初めて試したクエリは、別のスレッドの入力に基づいています。新しいソリューションをありがとう。 – ajmalmhd04

+0

上記のレコードを連続した日付範囲のグループとして作成する場合は、変更を提案できますか? start_date&end_dateの既存のリストに、それぞれレート300の(11/01/2017〜2013年1月13日)エントリがあるとします。クエリは連続する日付ではないため、新しい行になるはずです。私はlead()で試してみましたが、期待される結果を得ることができませんでした。さらに1つのエントリー(15/01/2017&15/01/2017)、レート300。 – ajmalmhd04

関連する問題