Группировка результатов SQL по непрерывным временным интервалам (oracle sql)

У меня есть следующие данные в таблице, как показано ниже, и я ищу способ сгруппировать непрерывные интервалы времени для каждого возвращаемого идентификатора:

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

и так далее ...

пс. У меня есть пример скрипта, но я не знаю, как прикрепить свой файл.

Привет всем здесь больше входных данных:

  1. Существует только одна запись с отметкой времени для определенного идентификатора.
  2. Пользователи могут быть разными, например для 1-го дня Давида, 2-го дня неизвестного, 3-го дня Давида и так далее.

Таким образом, для каждого дня года для каждого идентификатора существует одна строка, но с разными пользователями. Теперь я хочу увидеть точку останова, различия основаны на интервалах time_stamp с первого до последнего дня для определенного идентификатора в дневном порядке с начала дня до последнего дня.

Результат запроса должен быть:

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

person Community    schedule 20.05.2009    source источник
comment
Пожалуйста, удалите свой список операторов вставки и замените его ссылкой на файл для загрузки скрипта. Так вам будет легче помочь. Сейчас невозможно понять ваш вопрос. Удачи.   -  person Pablo Santa Cruz    schedule 20.05.2009


Ответы (1)


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

Это должно сработать.

ЕСЛИ вам нужен диапазон дат для каждого идентификатора, но все имена, которые вы можете сделать:

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)
person Ron Savage    schedule 20.05.2009
comment
Привет, Рон. Спасибо за ваш ответ, но этот запрос вернет группу отдельных строк. Я мог бы отправить вам свой сценарий, если вы хотите уточнить, что я ищу!? Ваш запрос вернет что-то вроде: ID NAME MIN_DATE MAX_DATE 100 David 20011128 20090405 100 Sara 20050408 20050417 100 Unknown 20080417 20081231, поскольку вы видите, что интервалы неверны. - person ; 21.05.2009
comment
Какой интервал вы ищете? минимальная/максимальная дата только идентификатора? Только Имя? Или весь набор данных? - person Ron Savage; 21.05.2009
comment
Похоже, он пытается разбить его на какие-то группы по неделям. Проблема в том, что он не использует реальный шаблон. с 28.11 по 03.12 - 6 дней, с 04.12 по 07.12 - 4 дня, с 08.12 по 15.12 - 8 дней, с 16.12 по 20.12 - 5 дней. Либо его пример не очень хорош, либо у него есть какие-то другие критерии. - person Marshall Fryman; 21.05.2009
comment
Очередь номер 2 не работает, я добавил дополнительную информацию в свой вопрос. Спасибо и, пожалуйста, за мою неуклюжую работу с этим сайтом, я впервые использую этот сайт, я поправлюсь, обещаю. - person ; 21.05.2009