按连续时间间隔对SQL结果进行分组(oracle sql)

时间:2009-05-20 19:40:33

标签: oracle10g

我在下表中有以下数据,我正在寻找一种方法来为每个id返回的连续时间间隔进行分组:

CREATE TABLE DUMMY
(
  ID          VARCHAR2(10 BYTE),
  TIME_STAMP  VARCHAR2(8 BYTE),
  NAME        VARCHAR2(255 BYTE)
);

SELECT ID, min(TIME_STAMP) "startDate", max(TIME_STAMP) "endDate", NAME
GROUP BY ID , NAME

类似

100 20011128 20011203 David
100 20011204 20011207 Unknown
100 20011208 20011215 David
100 20011216 20011220 Sara

依旧......

PS。我有一个示例脚本,但我不知道如何附加我的文件。

嗨,这里的每一个都是更多的输入:

  1. 对于特定ID,只有一条带有time_stamp的记录。
  2. 用户可以有所不同,例如第1天David,第2天未知,第3天David等等。
  3. 因此,每个ID的每一天都有一行,但用户不同。 现在,我希望看到断点,差异基于第一天的time_stamp间隔 直到最后一天,从开始日到最后一天,每天都有特定ID。

    查询结果应为:

    ID   NAME     MIN_DATE  MAX_DATE
    100  David    20011128  20050407
    100  Sara     20050408  20050417
    100  David    20050418  20080416
    100  Unknown  20080417  20080507
    100  David    20080508  20080508
    100  Unknown  20080509  20080607
    100  David    20080608  20080608
    100  Unknown  20080609  20080921
    100  David    20080922  20080922
    100  Unknown  20080923  20081231
    100  David    20090101  20090405
    

    感谢

    嗨再次,非常感谢大家,我已经解决了问题,这是解决方案:

    select id, min(time_stamp), max(time_stamp), name
    from   ( select id, time_stamp, name,
                    max(rn) over (order by time_stamp) grp
             from   ( select id, time_stamp, name,
                             case
                                  when lag(name) over (order by time_stamp) <> name or
                                       row_number() over (order by time_stamp) = 1
                                  then row_number() over (order by time_stamp)
                             end rn
                      from   dummy
                    )
           )
    group by id, grp, name
    order by 1
    

1 个答案:

答案 0 :(得分:0)

Select
   ID,
   Name,
   min(time_stamp) min_date,
   max(time_stamp) max_date
from
   Dummy
group by
   Id,
   Name

这应该有效。

如果您想要每个Id的日期范围,但您可以使用所有名称:

Select
   d.Id,
   d.Name,
   dr.min_date,
   dr.max_date
from
   Dummy d

   JOIN 
      (Select
         Id,
         min(time_stamp) min_date,
         max(time_stamp) max_date
      from
         Dummy
      group by
         Id 
      ) dr
      on ( dr.Id = d.Id)