Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle10g 按连续时间间隔对SQL结果进行分组(oracle SQL)_Oracle10g - Fatal编程技术网

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

Oracle10g 按连续时间间隔对SQL结果进行分组(oracle SQL),oracle10g,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 ,

我在下表中有以下数据,我正在寻找一种方法,对每个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
等等

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

嗨,这里的每个人都有更多的投入:

对于特定ID,只有一条记录带有时间戳。 用户可以是不同的,例如第1天的David、第2天的unknown、第3天的David等等。 因此,对于每个ID,一年中的每一天都有一行,但用户不同。 现在,我想看看断点,从第一天开始,基于时间戳间隔的差异 从开始到最后一天,按日期顺序为特定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
这应该行得通

如果您想要每个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)

请删除您的insert语句列表,并通过指向下载脚本的文件的链接进行更改。那样会更容易帮助你。现在,不可能理解你的问题。祝你好运。嗨,罗恩,谢谢你的回答,但是这个查询将返回一组不同的行。如果你想写下我要找的东西,我可以把我的剧本寄给你!?您的查询将返回如下内容:ID名称MIN_DATE MAX_DATE 100 David 20011128 20090405 100 Sara 20050408 20050417 100 Unknown 20080417 20081231,因为您看到间隔错误。您要查找的间隔是什么?仅ID的最小/最大日期?只是名字?还是整个数据集?看起来他想把数据分成几组。问题是他没有使用真正的模式。11-28至12-03为6天,12-04至12-07为4天,12-08至12-15为8天,12-16至12-20为5天。要么他的示例输出不是很好,要么他有其他一些标准。2号问题不起作用,我在我的问题中添加了更多信息。谢谢,请给我这个网站的笨拙处理,这是我第一次使用这个网站,我会变得更好,我保证。
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)