Группировка результатов SQL по непрерывным временным интервалам (oracle sql) - PullRequest
0 голосов
/ 20 мая 2009

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

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

1 Ответ

0 голосов
/ 21 мая 2009
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...