2015-04-29 3 views
0

У меня есть миллионы данных в течение дня в таблице Oracle в трех столбцах, меток времени, статуса и значения.Как выбрать группы строк из таблицы Oracle?

Выбрать Rownum, Временная метка, Статус, OrderId from temp_table rownum < 11; возвращает

1 2015-04-28T12: 41: 34.1616834Z бронирование 100
2 2015-04-28T12: 41: 34.1888649Z Удалить 100
3 2015-04-28T12: 55: 59.3789387Z Выполнить 200
4 2015-04-28T12: 55: 59.3825833Z Persist 200
5 2015-04-28T12: 55: 59.3898336Z Книга 200
6 2015-04-28T12: 55: 59.3903645Z Удалить 200

7 2015-04-28T12: 57: 37.5718992Z Бронирование 200
8 2015-04-28T12: 57: 37.5723 847Z Удалить 200
9 2015-04-28T12: 57: 37.5725199Z Бронирование 300
10 2015-04-28T12: 57: 37.5728888Z Удалить 300

Я заинтересован в списке четырех временных меток, сгруппированных по Выполняйте, сохраняйте, загружайте и удаляйте, появляясь вместе для каждого orderId для этого дня.

Меня не интересуют строки 7 и 8, хотя orderId одинаково [поскольку они не сгруппированы вместе с помощью Execute, Persist, Book и Delete].

Могу ли я сделать это с помощью аналитической функции?

Благодаря

+0

Почему вы отметите это с 'plsql'? Вы хотите сохранить хранимую процедуру? –

+0

Вам нужны первые 4 метки времени? И почему строка 8 исключена - ее статус «Удалить» – Bohemian

+0

Я хочу, чтобы все отметки времени отображались в этом упорядоченном наборе групп Execute, Persist, Book и Delete для этого дня. – user3588480

ответ

0

Не очень элегантно, но работает запрос:

with t1 as (
    select tstamp ts, status st, orderid oid, 
     decode(status, 'Execute', 1, 'Persist', 2, 'Book', 3, 'Delete', 4, 5) ds 
    from temp_table), 
t2 as (
    select ts, st, oid, ds 
    , decode(ds, 1, 1, lag(ds, ds-1) 
     over (partition by oid, trunc(ts) order by ts, ds)) d1 
    , case when ds = 1 then lead(ds) over (partition by oid, trunc(ts) order by ts, ds) 
      when ds = 2 then 2 
      when ds = 3 then lag(ds) over (partition by oid, trunc(ts) order by ts, ds) 
      when ds = 4 then lag(ds, 2) over (partition by oid, trunc(ts) order by ts, ds) 
     end d2 
    , case when ds = 1 then lead(ds, 2) over (partition by oid, trunc(ts) order by ts, ds) 
      when ds = 2 then lead(ds) over (partition by oid, trunc(ts) order by ts, ds) 
      when ds = 3 then 3 
      when ds = 4 then lag(ds) over (partition by oid, trunc(ts) order by ts, ds) 
     end d3 
    , decode(ds, 4, 4, lead(ds, 4-ds) 
     over (partition by oid, trunc(ts) order by ts, ds)) d4 
    from t1) 
select ts, st, oid from t2 
    where (d1, d2, d3, d4) in ((1, 2, 3, 4)) 
    order by oid, ts, ds 
+0

Что-то не так с сайтом SQLFiddle.com, так или иначе [здесь] (http://sqlfiddle.com/#!4/d0370) - это данные, которые я использовал. –

Смежные вопросы