C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как выбрать записи интервал между которыми не, превышает 15 минут
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)

Вернуться в Работа с базами данных в C++Builder