Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите, пожалуйста с запросом  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 164
Здравствуйте!
Надо реализовать запросом SQL Server 2000 следующее:
Есть таблица с занятыми промежутками времени, например,
900 1030
1115 1125
1310 1405
и т.д.
Необходимо получить таблицу со свободными промежутками
1030 1115
1125 1310
и т.д.

Предложенный вариант
Select Alias1.field2, Min(Alias2.field1)
From tTable Alias1 Join tTable Alias2 On Alias1.Field2<=Alias2.Field1 Group by 1
раскритиковали как неэффкктивный на больших базах.

На ORACLE предложили такое
SELECT Field2 start_int, LEAD(Field1) OVER (ORDER BY Field1) end_int FROM TTABLE

Как лучше сделать на SQL Server 2000?
24 янв 12, 13:11    [11959590]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста с запросом  [new]
aleks2
Guest
declare @t table(start int, [end] int, n identity primary key clustered)

-- допущение: пересечений интервалов нема
insert @t table(start, [end]) 
select start, [end] FROM [Есть таблица с занятыми промежутками времени]
order by start, [end] asc

select T1.[end] as start, T2.start as [end]
FROM @t T1 inner join @t T2 on T1.n+1=T2.n
WHERE T1.[end]<T2.start
24 янв 12, 13:40    [11959888]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста с запросом  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 164
Этот вариант с самообъединением практически, как и у меня. Он будет выполняться быстро на больших базах? Нельзя ли применить в запросе аналитические функции?
Пересекающихся периодов нет, расписание проверяется на этапе ввода.
24 янв 12, 14:05    [11960170]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста с запросом  [new]
aleks2
Guest
ArkadyL
Этот вариант с самообъединением практически, как и у меня.

Ээээ? Где ты тут видишь группировку? Хе-хе... тебе ишо учиться нада.

ArkadyL
Он будет выполняться быстро на больших базах?

Это самое быстрое, что тебе светит на MS SQL 2000.

ArkadyL
Нельзя ли применить в запросе аналитические функции?

Применить можна. Тока для чего?
24 янв 12, 14:18    [11960291]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста с запросом  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
ArkadyL
Этот вариант с самообъединением практически, как и у меня. Он будет выполняться быстро на больших базах? Нельзя ли применить в запросе аналитические функции?
Пересекающихся периодов нет, расписание проверяется на этапе ввода.


Большие базы-это какие( десятки,сотни Гб)?
Аналитические функции для чего?
Время выполнение запроса какое?
24 янв 12, 14:20    [11960301]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста с запросом  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 164
aleks2,

Я тут вижу подозрительное выражение
автор
on T1.n+1=T2.n

такое вряд ли случится
24 янв 12, 14:33    [11960463]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста с запросом  [new]
aleks2
Guest
ArkadyL
aleks2,

Я тут вижу подозрительное выражение
автор
on T1.n+1=T2.n

такое вряд ли случится


Вот она - кондовая безграмотность.

Не понимает, а поучает...
24 янв 12, 14:37    [11960509]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста с запросом  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
ArkadyL
aleks2,

Я тут вижу подозрительное выражение
автор
on T1.n+1=T2.n

такое вряд ли случится

проверить ку?
24 янв 12, 14:38    [11960518]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста с запросом  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 164
Приведённый мною вариант раскритиковали на 10000 записей

[url=]http://forum.foxclub.ru/read.php?29,545964[/url]

вот и советуюсь
24 янв 12, 14:39    [11960541]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста с запросом  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 164
В нашей базе никаких identity не предвидится.
24 янв 12, 14:41    [11960562]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста с запросом  [new]
aleks2
Guest
ArkadyL
В нашей базе никаких identity не предвидится.


Экие принципиальные.

Учить иных - тяжелый крест...
-- это как бы ваша таблица
declare @Есть_таблица table(start int, [end] int)

insert @Есть_таблица 
select 900, 1030 
union all
select 1115, 1125 
union all
select 1310, 1405 



-- это как бы ВСПОМОГАТЕЛЬНАЯ табличная переменная никак не покушающаяся на ваши прынцыпы "В нашей базе никаких identity не предвидится"
declare @t table(start int, [end] int, n int identity primary key clustered)

-- допущение: пересечений интервалов нема
insert @t (start, [end]) 
select start, [end] FROM @Есть_таблица
order by start, [end] asc

select T1.[end] as start, T2.start as [end]
FROM @t T1 inner join @t T2 on T1.n+1=T2.n
WHERE T1.[end]<T2.start
24 янв 12, 14:48    [11960672]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста с запросом  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 164
Виноват, находясь в печали, не обратил внимание, что создаётся промежуточная таблица с identity.
Если вы считаете, что предварительный перенос всех нужных данных во временную таблицу с последующим запросом к ней эффективнее одного изощрённого запроса, я спорить не буду.
24 янв 12, 15:07    [11960907]     Ответить | Цитировать Сообщить модератору
 Re: Помогите, пожалуйста с запросом  [new]
aleks2
Guest
ArkadyL
Если вы считаете, что предварительный перенос всех нужных данных во временную таблицу с последующим запросом к ней эффективнее одного изощрённого запроса, я спорить не буду.


Это не я считаю. Это те ишо подучиться нужно.

Select Alias1.field2, Min(Alias2.field1)
From tTable Alias1 Join tTable Alias2 On Alias1.Field2<=Alias2.Field1 Group by 1

Алгоритм трудоемкости ~N^2, где N - число записей в базовой таблице.

Предлагаемый мною - алгоритм трудоемкости ~N.

Так, что в пределе N стемящегося к бесконечности, твой запрос сливает "по-определению".

Реально он сольет для любого N.
24 янв 12, 17:15    [11962472]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить