Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Поиск повторяющихся последовательных событий  [new]
Schakal
Member

Откуда:
Сообщений: 7
Господа, добрый день!

Подскажите плиз.. Упёрся и ни в какую.

Есть табличка - протокол активности юзеров в системе (складской учёт). Для простоты - три колонки - ячейка хранения, тип операции - внесение товара или вынесение его оттуда и dstamp.
Задача с виду простая - получить список ячеек, по которым 2 или более раза подряд выполнялась одна и та же операция без выполнения другой операции между ними.

Реально такое сделать?

Спасибо большое заранее!
15 мар 10, 13:15    [8479106]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Schakal,

приведи тестовые данные в
WITH AS
и покажи какой должен быть результат
15 мар 10, 13:20    [8479187]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Schakal,

вообще напрашивается
LEAD OVER()
15 мар 10, 13:21    [8479201]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Schakal,

with s as
(select 1 as cell, 'i' tp, sysdate - 1 as dt from dual union all
 select 1 as cell, 'd' tp, sysdate + 0 as dt from dual union all
 select 1 as cell, 'i' tp, sysdate + 1 as dt from dual union all
 
 select 2 as cell, 'd' tp, sysdate - 1 as dt from dual union all
 select 2 as cell, 'i' tp, sysdate + 0 as dt from dual union all
 select 2 as cell, 'i' tp, sysdate + 1 as dt from dual union all
 
 select 3 as cell, 'i' tp, sysdate - 1 as dt from dual union all
 select 3 as cell, 'd' tp, sysdate + 0 as dt from dual union all
 select 3 as cell, 'd' tp, sysdate + 1 as dt from dual
)

select cell, tp, dt from
    (select s.*,
    lag(tp, 1) over (partition by cell order by dt asc)  ld,
    lead(tp, 1) over (partition by cell order by dt asc) lg 
    from s
    )
where tp = ld or tp = lg 
order by cell, dt
15 мар 10, 13:27    [8479266]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
Schakal
Member

Откуда:
Сообщений: 7
Ух сколько ответов!
Спасибо мужики! Сейчас вчитаюсь во всё написанное и порою мануалы (я недалеко пока ушёл в изучении) и отпишусь о результатах!
15 мар 10, 13:34    [8479358]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Schakal

Спасибо мужики!

Мужики на лесоповале
15 мар 10, 13:36    [8479388]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
AmKad,

ну кто первый скажет, что мы барышни, в того первого мы бросим камень )
15 мар 10, 13:38    [8479399]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
Schakal
Member

Откуда:
Сообщений: 7
comphead
Schakal,

приведи тестовые данные в
WITH AS
и покажи какой должен быть результат


Сорри, ни разу не пользовался такой конструкцией..
15 мар 10, 13:42    [8479471]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Schakal,

см пост выше. AmkAd показал.
нам проще иметь дело с реальными данными, а не выдумывать их самим )
15 мар 10, 13:46    [8479537]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
Schakal
Member

Откуда:
Сообщений: 7
AmKad
Schakal,

with s as
(select 1 as cell, 'i' tp, sysdate - 1 as dt from dual union all
 select 1 as cell, 'd' tp, sysdate + 0 as dt from dual union all
 select 1 as cell, 'i' tp, sysdate + 1 as dt from dual union all
 
 select 2 as cell, 'd' tp, sysdate - 1 as dt from dual union all
 select 2 as cell, 'i' tp, sysdate + 0 as dt from dual union all
 select 2 as cell, 'i' tp, sysdate + 1 as dt from dual union all
 
 select 3 as cell, 'i' tp, sysdate - 1 as dt from dual union all
 select 3 as cell, 'd' tp, sysdate + 0 as dt from dual union all
 select 3 as cell, 'd' tp, sysdate + 1 as dt from dual
)

select cell, tp, dt from
    (select s.*,
    lag(tp, 1) over (partition by cell order by dt asc)  ld,
    lead(tp, 1) over (partition by cell order by dt asc) lg 
    from s
    )
where tp = ld or tp = lg 
order by cell, dt


Однако ничего не понял пока :) Создание исходной таблицы, конечно, понял, а вот дальше.. Подскажите плиз где порыть по PARTITION_BY и LAG/LEAD в жанре "для чайника"..
15 мар 10, 15:04    [8480298]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Schakal,

Аналитические фукнции
15 мар 10, 15:08    [8480332]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Schakal,

Линк
15 мар 10, 15:12    [8480367]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
Schakal
Member

Откуда:
Сообщений: 7
AmKad
Schakal,

Линк

Отличный линк! Всё доходит на глазах! Спасибо всем!
15 мар 10, 15:20    [8480476]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
JaRo
Member

Откуда:
Сообщений: 1659
AmKad
where tp = ld or tp = lg 
А зачем в обе стороны?
15 мар 10, 15:40    [8480674]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
AmKad
Member

Откуда:
Сообщений: 5222
JaRo
AmKad
where tp = ld or tp = lg 
А зачем в обе стороны?

Вопрос в том, почему вывожу операции а не ячейки?
Мне так больше нравица и ТС-у наглядно видно.
15 мар 10, 15:48    [8480763]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
JaRo
Member

Откуда:
Сообщений: 1659
AmKad
Мне так больше нравица
Ну, конечно, довод более, чем убедительный... Главное, чтобы автор понимал, что ему это не надо.
15 мар 10, 15:52    [8480820]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
AmKad
Member

Откуда:
Сообщений: 5222
JaRo
Главное, чтобы автор понимал, что ему это не надо.

Ну так возьмите и объясните, раз считаете нужным...
15 мар 10, 16:00    [8480902]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
Schakal
Member

Откуда:
Сообщений: 7
AmKad
JaRo
Главное, чтобы автор понимал, что ему это не надо.

Ну так возьмите и объясните, раз считаете нужным...

Да, объясните плиз вкратце :)
И ещё вопроси, надеюсь что последний - я могу в PARTITION BY дополнительно закинуть условие какое-нть (типа where), которое ещё сильнее урежет выборку?
15 мар 10, 16:46    [8481241]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Schakal,

нет.
15 мар 10, 16:57    [8481336]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
Schakal
Member

Откуда:
Сообщений: 7
Всё, все вопросы сняты!
Ничего что я тут сам с собой? :)
15 мар 10, 16:57    [8481337]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
Эксперимент
Guest
Попробовал поиграться с аналитическими функциями и хотел сделать так:


Почему last_value возвращает текущее значение а не последнее в соответствующей группе?

with s as
(select 1 as cell, 'i' tp, to_date('11.01.2010 01:01:01', 'DD.MM.YYYY HH24:MI:SS') as dt from dual union all
 select 1 as cell, 'd' tp, to_date('11.01.2010 02:01:01', 'DD.MM.YYYY HH24:MI:SS') as dt from dual union all
 select 1 as cell, 'i' tp, to_date('11.01.2010 03:01:01', 'DD.MM.YYYY HH24:MI:SS') as dt from dual union all
 
 select 2 as cell, 'd' tp, to_date('11.01.2010 04:01:01', 'DD.MM.YYYY HH24:MI:SS') as dt from dual union all
 select 2 as cell, 'i' tp, to_date('11.01.2010 05:01:01', 'DD.MM.YYYY HH24:MI:SS') as dt from dual union all
 select 2 as cell, 'i' tp, to_date('11.01.2010 06:01:01', 'DD.MM.YYYY HH24:MI:SS') as dt from dual union all
 select 2 as cell, 'i' tp, to_date('11.01.2010 07:01:01', 'DD.MM.YYYY HH24:MI:SS') as dt from dual union all
 
 select 3 as cell, 'i' tp, to_date('11.01.2010 08:01:01', 'DD.MM.YYYY HH24:MI:SS') as dt from dual union all
 select 3 as cell, 'd' tp, to_date('11.01.2010 09:01:01', 'DD.MM.YYYY HH24:MI:SS') as dt from dual union all
 select 3 as cell, 'd' tp, to_date('11.01.2010 10:01:01', 'DD.MM.YYYY HH24:MI:SS') as dt from dual
)

select s.*,
    first_value(dt) over (partition by cell,tp order by dt asc) f,
    last_value(dt) over (partition by cell,tp order by dt asc) l
    from s
order by s.cell, s.tp, s.dt;

что получилось

      cell     tp            dt                                f                               l
1	1	d	11.01.2010 2:01:01	11.01.2010 2:01:01	11.01.2010 2:01:01
2	1	i	11.01.2010 1:01:01	11.01.2010 1:01:01	11.01.2010 1:01:01
3	1	i	11.01.2010 3:01:01	11.01.2010 1:01:01	11.01.2010 3:01:01
4	2	d	11.01.2010 4:01:01	11.01.2010 4:01:01	11.01.2010 4:01:01
5	2	i	11.01.2010 5:01:01	11.01.2010 5:01:01	11.01.2010 5:01:01
6	2	i	11.01.2010 6:01:01	11.01.2010 5:01:01	11.01.2010 6:01:01
7	2	i	11.01.2010 7:01:01	11.01.2010 5:01:01	11.01.2010 7:01:01
8	3	d	11.01.2010 9:01:01	11.01.2010 9:01:01	11.01.2010 9:01:01
9	3	d	11.01.2010 10:01:01	11.01.2010 9:01:01	11.01.2010 10:01:01
10	3	i	11.01.2010 8:01:01	11.01.2010 8:01:01	11.01.2010 8:01:01

10.2.0.1
16 мар 10, 15:24    [8486758]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
Alexander Konakov
Member

Откуда:
Сообщений: 1027
Эксперимент,

наверное, потому, что
partition by cell,tp
а не
partition by cell
если я правильно понял суть вопроса
16 мар 10, 15:34    [8486882]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Эксперимент,

RTFM Oracle® Database SQL Reference: Analytic Functions - windowing_clause.

select s.*,
    first_value(dt) over (partition by cell,tp order by dt asc) f,
    last_value(dt) over (partition by cell,tp order by dt asc rows between current row and unbounded following) l
    from s
order by s.cell, s.tp, s.dt;
16 мар 10, 15:38    [8486916]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Эксперимент
Почему last_value возвращает текущее значение а не последнее в соответствующей группе?
То, что Вы хотите, это -
last_value(dt) over (partition by cell,tp)
Если order by, то он возвращает последнее среди просмотренных к этой строке
16 мар 10, 15:39    [8486921]     Ответить | Цитировать Сообщить модератору
 Re: Поиск повторяющихся последовательных событий  [new]
Эксперимент
Guest
Alexander Konakov,

нет интересуют именно группы по cell,tp

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

что не так?
16 мар 10, 15:39    [8486928]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить