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

Откуда:
Сообщений: 7
Есть таблица @sched с последовательностью чисел.
Есть таблица @hold , которая содержит интервалы.
Надо "раздвинуть" данные таблицы @sched интервалами из @hold

То есть, имеем последовательность
1,8,15,22,29,36,43. Интервалы 11-29, 43-45.
После обработки первого интервала
1,8,29,36,43,50,57
После обработки второго интервала
1,8,29,36,45,52,59

Возможно ли реализовать данный алгоритм без построчного перебора @hold ?


declare @sched table (val int)
declare @hold table (id int, f int, t int)

insert @sched
select 1
union
select 8
union
select 15
union
select 22
union
select 29
union
select 36
union
select 43

insert @hold
select 1,11,29
union
select 2,43,45
31 мар 04, 11:28    [605385]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без цикла и курсора  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
не совсем понятен алгоритм раздвигания
на мой взгляд после первой обработки должно получаться 1,8,33(15+(29-11)),40,47,54,61
попробуйте четко сформулировать и написать как что должно меняться - тогда обычно и самому получается написать
31 мар 04, 13:07    [605706]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без цикла и курсора  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
я так понимаю... есть какой-то промежуток, нужно чтобы из этого промежутка исчезли все значения в другой таблице... и стало максимальное из промежутка
другой вопрос... что будет если промежутки пересекаются
и что будет если из промежутка не будет ни одной записи...
например промежуток 37-42?

для спящего время бодрствования равносильно сну
31 мар 04, 13:29    [605766]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без цикла и курсора  [new]
_VIK_
Member

Откуда:
Сообщений: 7
Нет, всё именно так, как написал...

1,8,15,22,29,36,43. Интервалы 11-29
После обработки первого интервала
1,8,29,36,43,50,57

1. Находим минимальное число, которое попадает в интервал (15)
2. Высчитывам величину сдвига до конца интервала (29-15=14)
3. Увеличиваем на эту величину все числа, начиная с 15 (числа, определенного на шаге 1).
4. Переходим к следующему интервалу.

P.S. Если в данный интервал не попадает ни одно число - ничего не делаем...

Смысл этого изврата следующий:
Есть график выплат клиента (таблица @Sched).
Есть список периодов (интервалов), в которые выплаты отменены (@Hold)
Надо на основании таблицы Hold пересчитать график выплат... Хотелось бы сделать это без курсора, но пока заклинило, не выходит...


Для Алексея2003:
Промежутки пересекаться не могут... Если записей в промежутке нет - игнорируем промежуток

Спасибо, за внимание
31 мар 04, 13:48    [605818]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без цикла и курсора  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2386
Блог
Скорей всего нельзя. Но я подумаю..
31 мар 04, 14:04    [605877]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без цикла и курсора  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
если бы был промежуток не 43-45 а 43-53, то во второй обработке нужно число 50 обрабатывать?

для спящего время бодрствования равносильно сну
31 мар 04, 14:08    [605899]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без цикла и курсора  [new]
_VIK_
Member

Откуда:
Сообщений: 7
Алексей 2003

если бы был промежуток не 43-45 а 43-53, то во второй обработке нужно число 50 обрабатывать?

В этом случае, все числа, начиная с 43 надо увеличить на 10 (Конец_Промежутка - Первое_Число_В_Промежутке)
То есть получаем:
1,8,29,36,53,60,67
31 мар 04, 14:19    [605947]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без цикла и курсора  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
как рекурсия факториала получается... не знаю, решал ли кто подобные задачи одной выборкой без использования динамики... но я не видел...


для спящего время бодрствования равносильно сну
31 мар 04, 15:06    [606122]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без цикла и курсора  [new]
_VIK_
Member

Откуда:
Сообщений: 7
Ладно, спасибо, не судьба так не судьба. А то я подозревал, что это меня переклинило, что не могу запрос составить. Спасибо за внимание.
31 мар 04, 15:14    [606154]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без цикла и курсора  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
получается что окончательный вариант зависит от того в каком порядке мы будем раздвигать
тогда тока циклом
31 мар 04, 15:16    [606162]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без цикла и курсора  [new]
_VIK_
Member

Откуда:
Сообщений: 7
Наверное, Вы правы... Хотя имеет смысл для задачи только хронологический порядок.. (то есть начало следующего интервала обязательно больше конца предыдущего)
31 мар 04, 15:28    [606219]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без цикла и курсора  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2386
Блог
Факториал-то как раз посчитать легко
select n1.num, cast(exp(sum(log(n2.num))) as int) as fakt

from numbers n1 inner join numbers n2 on n1.num <= 10 and
n2.num <= n1.num and
n1.num > 0 and
n2.num > 0
group by n1.num
31 мар 04, 15:43    [606273]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить