2016-10-12 2 views
1

質問はおそらく間違って説明されていますが、これを他の方法で説明する方法はわかりません。私は、次のデータを持っている:(日付順)Oracle sql:同じグループ内の連続する最大連続する日付を確認する

DATE GROUP 
    11-Oct-16 A 
    12-Oct-16 A 
    13-Oct-16 A 
    14-Oct-16 B 
    15-Oct-16 B 
    16-Oct-16 A 
    17-Oct-16 A 
    18-Oct-16 C 
    19-Oct-16 C 
    20-Oct-16 C 
    21-Oct-16 C 
    22-Oct-16 A 
    23-Oct-16 A 
    24-Oct-16 A 

私はグループのための連続した使用方法を見つけたいです。私が望む結果は私よりもこの良く説明します:

GROUP MIN(DATE) MAX(DATE) 
    A 11-Oct-16 13-Oct-16 
    B 14-Oct-16 15-Oct-16 
    A 16-Oct-16 17-Oct-16 
    C 18-Oct-16 21-Oct-16 
    A 22-Oct-16 24-Oct-16 

任意のアイデアどのようにOracleのSQLでこれを行うには? ありがとうございます。

+0

注文を指示するID列がありますか? – JohnHC

答えて

2

これは方法であることができる:

with test("DATE","GROUP") as 
(
    select to_date('11-10-16', 'dd-mm-rr'),'A' from dual union all 
    select to_date('12-10-16', 'dd-mm-rr'),'A' from dual union all 
    select to_date('13-10-16', 'dd-mm-rr'),'A' from dual union all 
    select to_date('14-10-16', 'dd-mm-rr'),'B' from dual union all 
    select to_date('15-10-16', 'dd-mm-rr'),'B' from dual union all 
    select to_date('16-10-16', 'dd-mm-rr'),'A' from dual union all 
    select to_date('17-10-16', 'dd-mm-rr'),'A' from dual union all 
    select to_date('18-10-16', 'dd-mm-rr'),'C' from dual union all 
    select to_date('19-10-16', 'dd-mm-rr'),'C' from dual union all 
    select to_date('20-10-16', 'dd-mm-rr'),'C' from dual union all 
    select to_date('21-10-16', 'dd-mm-rr'),'C' from dual union all 
    select to_date('22-10-16', 'dd-mm-rr'),'A' from dual union all 
    select to_date('23-10-16', 'dd-mm-rr'),'A' from dual union all 
    select to_date('24-10-16', 'dd-mm-rr'),'A' from dual 
) 
select min("DATE"), max("DATE"), "GROUP" 
from (
     select "DATE", 
       "DATE" - row_number() over (partition by "GROUP" order by "DATE") as minDate, 
       "GROUP" 
     from test 
) 
group by "GROUP", minDate 
order by "GROUP", minDate 

外部一つは、単にこのようにグループ毎に行を構築し、この最小日付で集約しながら、内側のクエリは、連続した日付のグループの最小の日付を構築連続する日付。

予約語を列名として使用することは避けてください。

+2

日付は連続しているので、このケースではソリューションが動作します。より一般的な解決法は 'row_number()を(日付順) - row_number()を(グループ順で日付順に)'使用します。日付が連続していない可能性がある他の同様の問題を知っておくとよいでしょう。 – mathguy

0

基本的には、適切な答えが@mathguyのコメントにあったと思います。 ここでは、適切な完全なクエリを展開しています。

select GROUP_NAME, grp_id, min(date_field) as starting_date, max(date_field) as ending_date 
from (
select DATE_FIELD, GROUP_NAME, 
row_number() over (order by date_field) - row_number() over (partition by group_name order by date_field) as grp_id 
from darber.my_table) innested 
group by GROUP_NAME, grp_id 
order by min(date_field); 

注意:データベースに競合が発生しているため、フィールド名を変更しました。このソリューションでは、DATEはDATE_FIELDになり、GROUPはGROUP_NAMEになりました。

これは本当にスマートで洗練されたソリューションであることがわかりました。 他人を助けることを願っています。

関連する問題