Oracle - помогите сделать запрос - PullRequest
1 голос
/ 14 июля 2011

У меня есть источник данных в следующем формате:

Event Type| Date
1         | 2011-07-14 09:00
1         | 2011-07-14 09:01
1         | 2011-07-14 09:02
2         | 2011-07-14 09:30
2         | 2011-07-14 09:31
1         | 2011-07-14 10:00
1         | 2011-07-14 10:01

Типы событий сортируются по дате, как они произошли. Мне нужно сделать запрос, который покажет диапазоны дат, когда были использованы события, отсортированные по дате. Как это:

Event Type | Date Range
1          | 2011-07-14 09:00 - 2011-07-14 09:02
2          | 2011-07-14 09:30 - 2011-07-14 09:31
1          | 2011-07-14 10:00 - 2011-07-14 10:01

У вас есть какие-нибудь намеки? Я считаю, что это, вероятно, нужно будет сделать с помощью аналитических функций, но я пока не смог найти достойного решения.

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Вы также можете попробовать следующий подход:

WITH ranked AS (
  SELECT
    EventType,
    Date,
    ROW_NUMBER() OVER (ORDER BY Date) -
      ROW_NUMBER() OVER (PARTITION BY EventType ORDER BY Date) AS GroupID
  FROM Events
)
SELECT
  EventType,
  MIN(Date) AS StartDate,
  MAX(Date) AS EndDate
FROM ranked
GROUP BY
  GroupID,
  EventType
ORDER BY
  MIN(Date)
1 голос
/ 14 июля 2011

Я уверен, что есть лучшее решение, но как насчет этого?

WITH
  ordered_data AS
(
  SELECT ROW_NUMBER() OVER (ORDER BY Date) AS row_id, * FROM event_data
),
  [start_events] AS
(
  SELECT * FROM ordered_data  AS [start]
  WHERE NOT EXISTS (SELECT * FROM ordered_data WHERE row_id = [start].row_id - 1 AND event_type = [start].event_type)
),
  [end_events] AS
(
  SELECT * FROM ordered_data  AS [end]
  WHERE NOT EXISTS (SELECT * FROM ordered_data WHERE row_id = [end].row_id + 1 AND event_type = [end].event_type)
)

SELECT
  *
FROM
  [start_events]
INNER JOIN
  [end_events]
    ON [end_events].row_id = (SELECT MIN(row_id) FROM [end_events] WHERE row_id >= [start_events].row_id)

Это также должно справляться со сценариями, в которых «группа» имеет только одно событие; Такие как (1, 1, 2, 1, 1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...