Oracle sql:查找同一组中的最小-最大连续日期

Oracle sql:查找同一组中的最小-最大连续日期,sql,oracle,gaps-and-islands,Sql,Oracle,Gaps And Islands,我知道这个问题可能解释得不好,但我不知道还有什么别的解释。我有以下数据:(按日期排序) 我想找到组的连续用法。我想要的结果将比我更好地解释这一点: 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

我知道这个问题可能解释得不好,但我不知道还有什么别的解释。我有以下数据:(按日期排序)

我想找到组的连续用法。我想要的结果将比我更好地解释这一点:

    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中实现这一点吗? 谢谢。

这可以是一种方式:

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
内部查询为一组连续日期构建最小日期,而外部查询仅根据该最小日期进行聚合,从而为每组连续日期构建一行


另外,最好避免使用保留字作为列名。

因此基本上我认为正确的答案是@mathguy comment。 这里我只是扩展并给出适当的完整查询

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);
请注意:我更改了字段名,因为他们在我的数据库中提供了冲突。在此解决方案中,日期为“现在日期”字段,组为“现在组名称”

我发现这是一个非常聪明和优雅的解决方案。
我希望能帮助其他人。

我对小组中的多个成员也有同样的问题。如果遇到相同的问题,请将组名称替换为“groupMember1,groupMember2,…”

您是否有id列来指示顺序?在这种情况下,解决方案有效,因为日期是连续的。更一般的解决方案是使用
row\u number()over(按日期排序)-row\u number()over(按日期分组顺序)
。对于日期可能不连续的其他类似问题,很高兴知道。
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);