:: Visual Foxpro, Foxpro for DOS
Возможно ли реализовать запросом следующее?
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Здравствуйте!
Возможно ли реализовать запросом SQL Server следующее:
Есть таблица с занятыми промежутками времени, например,
900 1030
1115 1125
1310 1405
и т.д. В реальной жизни идут не подряд

Необходимо получить таблицу со свободными промежутками
1030 1115
1125 1310
и т.д.
Ratings: 0 negative/0 positive
Re: Возможно ли реализовать запросом следующее?
Mitchman

Сообщений: 9978
Откуда: Николаев
Дата регистрации: 24.05.2002
Create Cursor tTable (Field1 I, Field2 I)
Insert into tTable Values (900, 1030)
Insert into tTable Values (1115 ,1125)
Insert into tTable Values (1310,1405)
Select Alias1.field2, Min(Alias2.field1) from tTable Alias1 Join tTable Alias2 On Alias1.Field2<=Alias2.Field1 Group by 1


------------------
-
«свидомые украинцы озабочены не столько созданием украинской культуры, сколько уничтожением русской»
-
Олесь Бузина
Ratings: 0 negative/0 positive
Re: Возможно ли реализовать запросом следующее?
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Большое спасибо!
Ratings: 0 negative/0 positive
Re: Возможно ли реализовать запросом следующее?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
SELECT Field2 start_int, LEAD(Field1) OVER (ORDER BY Field1) end_int FROM TTABLE
в СУБД имеющей аналитические функции. Ибо на несколько порядков быстрее чем вариант с самообъединением. Фокс вообще подвиснет надолго если в курсоре будет около 10000 записей (а если побольше, то вывалится по превышению лимита размера временного файла).
На оракле разница (для 10000 записей) составляет 15 секунд против 0.047 секунды


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Возможно ли реализовать запросом следующее?
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
К сожалению, для SQL Server такой синтаксис не подходит. Буду счастлив, если кто-нибудь переведёт на этот язык.
Ratings: 0 negative/0 positive
Re: Возможно ли реализовать запросом следующее?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Эмуляция для MSSQL
www.rafael-salas.com
По похожему принципу (используя RECNO в подзапросах для реализации соединения 1-к-1 а не 1-к-куча+группировка) можно и для фокса "оптимальный" вариант запроса сделать (не требующий ужасного полу-картезианского самосоединения таблицы). Насколько я помню, leonid где-то на форуме уже публиковал реализацию. Впрочем, тебе это будет интересно лишь теоретически, в отличие от вышеприведенной ссылки
Да, не упоминал явно, ибо это очевидно, ВСЕ подобные варианты предполагают наличие весьма строгих ограничений по данным - например не должно быть никаких "пересечений" временных интервалов и дубликатов, не должно быть "перевёрнутых" интервалов (где дата окончания прописана меньше чем дата начала)...
Ну и отдельно решается чисто "практический" вопрос - нужно ли включать в ответ "открытые" выборки - т.е. от "начала времён" до начала первого интервала и от окончания последнего интервала до "конца света"


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Возможно ли реализовать запросом следующее?
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
MS SQL
select identity(int,1,1) id, f1, f2 into #tbl1 from tbl1 order by f1
select t1.f2, t2.f1 from #tbl1 t1 inner join #tbl1 t2 on t1.id=t2.id+1


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.




Исправлено 1 раз(а). Последнее : Влад Колосов, 24.01.12 13:44
Ratings: 0 negative/0 positive
Re: Возможно ли реализовать запросом следующее?
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Ну да, все интервалы в пределах рабочего дня и границы проверяются довольно легко, остальные проверки - на этапе ввода.
Спасибо, буду пробовать.
Ratings: 0 negative/0 positive
Re: Возможно ли реализовать запросом следующее?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
По ссылке чуть более "общий" вариант - использующий ROW_NUMBER() OVER ... с возможностью считать "по группам" и CTE - чтобы "одним запросом" - без временных таблиц.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Возможно ли реализовать запросом следующее?
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Признаться, у меня SQL Server 2000, но направление действий понятно.
Ratings: 0 negative/0 positive
Re: Возможно ли реализовать запросом следующее?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Кстати, в 2012 сервере уже добавили
msdn.microsoft.com


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Возможно ли реализовать запросом следующее?
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
На покупку нового продукта, скорее всего, это не повлияет.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 30 (Гостей: 30)

© 2000-2024 Fox Club 
Яндекс.Метрика