Dima |
Отправлено: 07.09.2004, 10:45 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 61
|
как выделить группу записей используя SQL при условии, что поле даты предыдущей записи отличается от последующей записи не более чем на 15 минут
используется MSSQLServer |
|
AVC |
Отправлено: 07.09.2004, 12:45 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Вы затронули очень интересную тему "вертикального объединения"
Вот пара вариантов решения на Oracle — может подчерпнете идеи.
Вариант 1 — связывание двух одинаковых выборок (время отзыва на тестовом примере 1sec)
CODE |
Select
t21.*
,t22.*
,(t21.Date_Time — t22.Date_Time) * (60*24*24) as dltSeconds
--
From
(-- нумеруем строки выборки
Select Rownum as rn, t1.*
From -- основной запрос
(Select LogLogID, Date_Time
From HHC.LogLog
Where User_Name = 'AVC'
Order By Date_Time asc
) t1
) t21
--
,(-- повторяем операцию
Select Rownum as rn, t2.*
From
(Select LogLogID, Date_Time
From HHC.LogLog
Where User_Name = 'AVC'
Order By Date_Time asc
) t2
) t22
--
Where 1 = 1
and t22.rn = t21.rn — 1 -- связываем текущую с предыдущей
and ((t21.Date_Time — t22.Date_Time) * (24*60*60)) <= 15
|
Вариант 2 — эмуляция курсора (время отзыва на тестовом примере 3min 52sec)
CODE |
Select l2.* From
(Select
l1.LogLogID
,l1.Date_Time
,(Select Max(l0.Date_Time)
From HHC.LogLog l0
Where l0.User_Name = 'AVC'
and l0.Date_Time < l1.Date_Time
) as Prev_Date_Time
--
From HHC.LogLog l1
Where l1.User_Name = 'AVC'
) l2
Where 1 = 1
and ((l2.Date_Time — l2.Prev_Date_Time) * (24*60*60)) <= 15
|
Знатокам Oracl'а. Прошу меня не пинать. Я знаю об аналитических функциях и умею их применять. Просто я старался написать запрос максимально приближенным к стандартному SQL |
|
Dima |
Отправлено: 08.09.2004, 06:02 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 61
|
в MSSQLServer используется термин 'соотнесенные подзапросы ' (Correlated subqueries) |
|