powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Создание "пары" близжайших строк удовлетворяющих условию
11 сообщений из 11, страница 1 из 1
Создание "пары" близжайших строк удовлетворяющих условию
    #39409464
Set_xx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеются логи содержащие такие столбцы:

Date | Action и прочие, но интересуют только эти
В первом записывается время и дата.

Date - содержит время старта либо время финиша либо время выполнения какого то этапа.

Action - хранит инфу о том что выполнялось в данный момент времени(начал запрос, выполнял этап, закончил запрос)

Как можно сгруппировать пары старт-финиш(считая что парой считается такие start и finish время между которыми минимальное) для дальнейшего нахождения дельты(времени выполнения текущего запроса.
...
Рейтинг: 0 / 0
Создание "пары" близжайших строк удовлетворяющих условию
    #39409468
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ хочешь тоже в эпистолярном жанре?
AmKad как следует задавать вопросы по sql

STFF start_of_group, match_recognize
...
Рейтинг: 0 / 0
Создание "пары" близжайших строк удовлетворяющих условию
    #39409597
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Set_xx,

Код: plsql
1.
select date as start_date, lead(date) over(order by date) end_date from t
...
Рейтинг: 0 / 0
Создание "пары" близжайших строк удовлетворяющих условию
    #39410599
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Set_xx,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with q as (select to_date('01.01.2017','dd.mm.yyyy') as ddate, 'Start' as Action from dual union all
select to_date('02.01.2017','dd.mm.yyyy') as ddate, 'Finish' as Action from dual union all
select to_date('11.01.2017','dd.mm.yyyy') as ddate, 'Start' as Action from dual union all
select to_date('01.02.2017','dd.mm.yyyy') as ddate, 'Finish' as Action from dual union all
select to_date('05.02.2017','dd.mm.yyyy') as ddate, 'Start' as Action from dual union all
select to_date('25.02.2017','dd.mm.yyyy') as ddate, 'Finish' as Action from dual)
select q1.ddate, q1.action, min(q2.ddate), q2.action 
from q q1 join q q2 on q1.action = 'Start' and q2.ddate > q1.ddate and q2.action = 'Finish'
group by q1.ddate, q1.action, q2.action
order by 1
...
Рейтинг: 0 / 0
Создание "пары" близжайших строк удовлетворяющих условию
    #39411050
Set_xx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
небольшой апдейт, по поводу замечания в первом ответе:

имеется бд с логами, логи имеют колонки: log_date log_action и другие, эти две являются "якорями" для проведения дальнейших вычислений, остальные поля при данной выборке роли не играют.

авторlog_date | log_action

27.02.2017 00:00:00.805000 | start of process
27.02.2017 00:00:00.815000 | calculcation
27.02.2017 00:00:00.815000 | end of process
27.02.2017 00:00:00.825000 | start of process
27.02.2017 00:00:00.825000 | calculcation
27.02.2017 00:00:00.835000 | calculcation
27.02.2017 00:00:00.835500 | end of process
27.02.2017 00:00:00.845000 | start of process
27.02.2017 00:00:00.855000 | calculcation
...
27.02.2017 00:00:00.865000 | calculcation
27.02.2017 00:00:00.875000 | start of process
27.02.2017 00:00:00.885000 | end of process

Мне необходимо взять за факт что ближний к "старту" "финиш" является парой, и в дальнейшем про создании запроса необходимо будет вывести время выполнения данного процесса, т.е delta(finish-start) = time_of_proc

С sql начал ознакомление только недавно, читаю литературу, но еще "не дошло" как реализовать данный запрос.
Пытался "выбросить" из исходных данных "calculation" и получался список чередований start, finish в дальнейшем разделил их на 2 таблицы и "присоединить" finish справа к start, тем самым получил соответствие в строке 'start | finish' но по каким то непонятным мне причинам кол-во начала и окончаний разное. Возможно БД с которой я работаю динамическая(еще не дошел до выяснения), что сподвигло меня на мысль что я иду в примитивном русле мышления, и хотел бы услышать у вас пару советов и нюансов.

P.S буду признателен если будут пояснения для всех действий для восприятия информации
...
Рейтинг: 0 / 0
Создание "пары" близжайших строк удовлетворяющих условию
    #39411343
Set_xx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ora601Set_xx,

Код: plsql
1.
select date as start_date, lead(date) over(order by date) end_date from t



Итоговый отввет имеет вид:
1- 2
2 - 3
3 - 4
..
N-1 N

Т.е получается финиш предыдущего берется за новый старт, как получить вид:
1 - 2
3 - 4
5 - 6
..
...
Рейтинг: 0 / 0
Создание "пары" близжайших строк удовлетворяющих условию
    #39411350
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Set_xx,

Так а чем тебе мой вариант с объединением таблиц не нравится?
Код: plsql
1.
2.
3.
4.
select q1.ddate, q1.action, min(q2.ddate), q2.action 
from q q1 join q q2 on q1.action = 'Start' and q2.ddate > q1.ddate and q2.action = 'Finish'
group by q1.ddate, q1.action, q2.action
order by 1
...
Рейтинг: 0 / 0
Создание "пары" близжайших строк удовлетворяющих условию
    #39411367
Set_xx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DshedooSet_xx,

Так а чем тебе мой вариант с объединением таблиц не нравится?
Код: plsql
1.
2.
3.
4.
select q1.ddate, q1.action, min(q2.ddate), q2.action 
from q q1 join q q2 on q1.action = 'Start' and q2.ddate > q1.ddate and q2.action = 'Finish'
group by q1.ddate, q1.action, q2.action
order by 1



Я не понимаю этот запрос) с lead я еще как то более менее ознакомился. Но если пояснишь что это за q1 q2 и прочее - буду только рад
...
Рейтинг: 0 / 0
Создание "пары" близжайших строк удовлетворяющих условию
    #39411385
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Set_xx,

Можно обойтись и LEAD, преобразовав таблицу к нужному виду: старт - финиш - старт - финиш (убрав "лишние" строки).
Но можно просто присоединить таблицу саму к себе по ближайшим строкам (q - это название таблицы, которая прописана в with, q1 и q2 - это алиасы).

По сути, мы выбираем все записи из таблицы, у которых action = 'Start' (q1.action = 'Start'),
затем присоединяем к ним все записи из этой же таблицы, у которых action = 'Finish' (q2.action = 'Finish'),
У нас получается куча записей вида:
1) старт1 - финиш1
2) старт1 - финиш2
3) старт1 - финиш3
4) старт2 - финиш1
5) старт2 - финиш2
6) старт2 - финиш3
...
Затем мы обрезаем "финишы" условием: что дата финиша больше даты старта (q2.ddate > q1.ddate).
Получим:
1) старт1 - финиш1
2) старт1 - финиш2
3) старт1 - финиш3
4) старт2 - финиш2
5) старт2 - финиш3
...
Затем из этого уже берём "ближайший" к старту финиш, т.е. дата финиша минимальна для этого старта (min(q2.ddate))
...
Рейтинг: 0 / 0
Создание "пары" близжайших строк удовлетворяющих условию
    #39411448
Set_xx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoo,

А достаточно ли рационально использовать данный метод с таблицей в несколько миллионов строк? Ведь получается, что сначала генерируются все возможные пары, а далее идет выборка по наименьшему. Какие еще альтернативы можно рассмотреть?
...
Рейтинг: 0 / 0
Создание "пары" близжайших строк удовлетворяющих условию
    #39411458
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Set_xx,

По поводу производительности и рациональности мало что могу подсказать.

Можно сделать подзапрос + lead.
Выбирать все записи юзая lead, а затем обрезать "лишние" ещё одним селектом (где action <> 'Start').
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Создание "пары" близжайших строк удовлетворяющих условию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]