Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2010, 15:14   #11
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ну как же?!
можно заюзать любой запрос из постов 5-7 (чота мне кажется что в МССКЛ 2008 должны уже быть lag()/lead())
а точнее либо 5 в чистом виде (и к нему прикручиваете insert into t select ...), либо 6/7 вставляете в свой "курсор", в котором останется только делать вставку на место найденной "дырки"
soleil@mmc вне форума Ответить с цитированием
Старый 12.01.2010, 15:24   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Оно и понятно, но элегантного варианта для MS SQL пока никто не предложил.
согласен. Моих знаний MS SQL явно недостаточно!

ну, по крайней мере, тот вариант, который предложил я - во много эффективнее того, что Вы используете.

Конечно, в вашем случае он даёт не конечный результат, а болванку, НО,
по которой в простейшем цикле можно сразу заполнять файл с пропусками!! пояснить, или Вы поняли мою мысль?

добавлено.
Цитата:
Сообщение от soleil@mmc
либо 6/7 вставляете в свой "курсор", в котором останется только делать вставку на место найденной "дырки"
soleil@mmc, +1
Спасибо, именно это я и пытаюсь сказать!

Последний раз редактировалось Serge_Bliznykov; 12.01.2010 в 15:27.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.01.2010, 17:18   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а вот, например, попробуйте такой код:
Код:
declare @table table ([name] varchar(15), num numeric(15))

insert into @Table ([name], [num]) values ('xxx', 3)
insert into @Table ([name], [num]) values ('xxx', 4)
insert into @Table ([name], [num]) values ('xxx', 5)
insert into @Table ([name], [num]) values ('xxx', 6)
insert into @Table ([name], [num]) values ('yyy', 1)
insert into @Table ([name], [num]) values ('yyy', 5)
insert into @Table ([name], [num]) values ('yyy', 7)

Declare @CurName as VarChar(50),
 @NumBeg as int, @NumEnd as int,
 @Cnt as int, @I as Int

DECLARE names_cursor CURSOR FOR 
select t1.[name] as CurName, t1.[num]+1 NumBeg, min(t2.[num])-1 NumEnd, min(t2.[num])-t1.[num]-1 Cnt
from 
  (select [name], 0 as [num] from @table
       group by [name]
   union all 
   select [name], [num] from @table) t1, @table t2
where t1.[num]<t2.[num]
  and t1.[name] = t2.[name]
group by t1.[name], t1.[num]
having min(t2.[num])-t1.[num]>1

OPEN names_cursor

FETCH NEXT FROM names_cursor INTO @CurName, @NumBeg, @NumEnd, @Cnt
WHILE @@FETCH_STATUS = 0
BEGIN
   set @I = 0
   while @I<@Cnt 
   begin
     insert into @Table ([name], [num]) values (@CurName, @NumBeg + @I)
     set @I = @I + 1
   end  
   FETCH NEXT FROM names_cursor INTO @CurName, @NumBeg, @NumEnd, @Cnt
END
CLOSE names_cursor  
DEALLOCATE names_cursor

select * from @table order by [name], [num]
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.01.2010, 23:21   #14
vario_rus
Пользователь
 
Регистрация: 05.05.2009
Сообщений: 10
По умолчанию

Код для PL/SQL внимательно не изучил, пока не особо с ним дружу.

Код:
select t1.[name] as CurName, t1.[num]+1 NumBeg, min(t2.[num])-1 NumEnd, min(t2.[num])-t1.[num]-1 Cnt
from 
  (select [name], 0 as [num] from @table
       group by [name]
   union all 
   select [name], [num] from @table) t1, @table t2
where t1.[num]<t2.[num]
  and t1.[name] = t2.[name]
group by t1.[name], t1.[num]
having min(t2.[num])-t1.[num]>1
из моей таблицы достает результат 18 секунд, причем достает не то
vario_rus вне форума Ответить с цитированием
Старый 13.01.2010, 00:17   #15
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от vario_rus Посмотреть сообщение
Код для PL/SQL внимательно не изучил, пока не особо с ним дружу.
какой PL/SQL?
см. запрос в посте №6 - кляуза with исключительно для моделирования тестовых данных
и ее можно (и даже нужно) опустить - данные же в БД есть
остается lag()
нужно проверить прикручена ли в этой версии мсскл эта аналитическая функа
Цитата:
Сообщение от vario_rus Посмотреть сообщение
из моей таблицы достает результат 18 секунд, причем достает не то
странно
у меня на тестовых данных все ок
может вылоите срез даных?
soleil@mmc вне форума Ответить с цитированием
Старый 13.01.2010, 10:30   #16
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
из моей таблицы достает результат 18 секунд, причем достает не то
1) что значит - "не то"
действительно, заполните небольшую табличку и выложите её (или сгенерируйте для неё SQL) - посмотрим, что там "не то"...
2) для ускорения я бы добавил индексы по полям name и num
3) мой полностью готовый для MS SQL тестовый пример из пост #13 проверили? работает?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.01.2010, 11:31   #17
vario_rus
Пользователь
 
Регистрация: 05.05.2009
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
1) что значит - "не то"
действительно, заполните небольшую табличку и выложите её (или сгенерируйте для неё SQL) - посмотрим, что там "не то"...
2) для ускорения я бы добавил индексы по полям name и num
3) мой полностью готовый для MS SQL тестовый пример из пост #13 проверили? работает?!
Дело было в таблице, поле NAME формировалось динамически, из за этого были тормоза, создал временную на ее основе с индексами, заработало и результат верный.
Немного модифицировал курсорный запрос на:
Код:
select t1.[name] as CurName, t1.[num]+1 NumBeg, min(t2.[num])-1 NumEnd, min(t2.[num])-t1.[num]-1 Cnt
from 
  (select [name], 0 as [num] from ttable
       group by [name]
   union all 
   select [name], [num] from ttable) t1, ttable t2
where t1.[num]<t2.[num]
  and t1.[name] = t2.[name]
group by t1.[name], t1.[num]
having min(t2.[num])-t1.[num]>1
OPEN names_cursor
для того, что бы в результат попали только пропущенные строки из таблицы ttable, получил "Missing SQL property" в ХП. Из консольки же отрабатывает нормально. Конкретно не нравится ей "ttable t2" если поменять на @table t2, не ругается, но и результата, естесственно, нет.
За пример спасибо, попробую его переложить на основную таблицу.
vario_rus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация страниц spein PHP 1 14.12.2009 23:54
[Delphi] TQuery и реализация запроса. MaGWaY_minsk Помощь студентам 2 12.05.2009 00:31
Реализация программы K123 Общие вопросы C/C++ 2 07.05.2009 20:30
Реализация очереди! Lazio Помощь студентам 2 08.04.2009 17:41
Реализация конфигуратора BlackOmen Общие вопросы Delphi 3 30.05.2008 17:12