Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как грамотно растиражировать строку / 7 сообщений из 7, страница 1 из 1
17.09.2021, 11:07
    #40098246
YoHnA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как грамотно растиражировать строку
День добрый!

Есть вьюшка вида Код1, Код2, Код3, Значение, ДеньСтарта, ДеньОкончания
Типа 1, 1, 2, 123, 3, 3
1, 1, 2, 123, 4, 4
1, 1, 2, 123, 5, 8
1, 1, 2, 123, 9, 9
И мне нужно, чтобы это превратилось в
1, 1, 2, 123, 3, 3
1, 1, 2, 123, 4, 4
1, 1, 2, 123, 5, 5
1, 1, 2, 123, 6, 6
1, 1, 2, 123, 7, 7
1, 1, 2, 123, 8, 8
1, 1, 2, 123, 9, 9

Очень желательно без процедурок с циклами, потому что объемы могут быть большие и цикличить фиг знает сколько таких строк может быть небыстро
Какие-от оконные функции может быть применить? Помогите, пожалуйста
...
Рейтинг: 0 / 0
17.09.2021, 11:13
    #40098250
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как грамотно растиражировать строку
Да обычный рекурсивный CTE. Вряд ли разность ДеньОкончания-ДеньСтарта велика, так что глубина рекурсии будет небольшая.

Либо можно выгрести MIN(ДеньСтарта), MAX(ДеньОкончания), на их основе сгенерить список дней, и потом привязать к исходной таблице и отобрать попадающее в диапазон записи.
...
Рейтинг: 0 / 0
17.09.2021, 11:24
    #40098253
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как грамотно растиражировать строку
YoHnA,
lead() + таблица чисел
...
Рейтинг: 0 / 0
17.09.2021, 11:25
    #40098255
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как грамотно растиражировать строку
YoHnA,

используйте таблицу чисел, например от 1 до 10 и cross join. Условие: день старта + число <= день окончания.
...
Рейтинг: 0 / 0
17.09.2021, 14:31
    #40098323
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как грамотно растиражировать строку
YoHnA,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
 b.Код1, b.Код2, b.Код3, b.Значение, b.ДеньСтарта, b.ДеньОкончания
from
 Представление a cross apply
 (
  select top (a.ДеньОкончания - a.ДеньСтарта + 1)
   a.Код1, a.Код2, a.Код3, a.Значение, a.ДеньСтарта, a.ДеньСтарта
  from
   master.dbo.spt_values
 ) b (Код1, Код2, Код3, Значение, ДеньСтарта, ДеньОкончания)
...
Рейтинг: 0 / 0
17.09.2021, 15:17
    #40098335
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как грамотно растиражировать строку
Поправочка
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
 b.Код1, b.Код2, b.Код3, b.Значение, b.ДеньСтарта, b.ДеньСтарта as ДеньОкончания
from
 Представление a cross apply
 (
  select top (a.ДеньОкончания - a.ДеньСтарта + 1)
   a.Код1, a.Код2, a.Код3, a.Значение, a.ДеньСтарта + row_mumber() over (order by 1/0) - 1
  from
   master.dbo.spt_values
 ) b (Код1, Код2, Код3, Значение, ДеньСтарта)
...
Рейтинг: 0 / 0
21.09.2021, 12:29
    #40098945
YoHnA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как грамотно растиражировать строку
Всем спасибо за идеи и решения, в итоге воспользовалось советом с cross join и таблицей чисел :)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как грамотно растиражировать строку / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]