У меня есть следующие данные в таблице, как показано ниже, и я ищу способ сгруппировать непрерывные временные интервалы для каждого возвращаемого идентификатора:
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-го дня неизвестно, 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