2016-10-12 117 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()over(按日期排序) - row_number()over(按日期分組)。對於日期可能不連續的其他類似問題,很有幫助。 – 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。

我發現這是一個非常聰明和優雅的解決方案。 我希望能幫助別人。

相關問題