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

Откуда:
Сообщений: 9
Как мне использовать функции LAG и DateADD?
Есть две таблицы

create table #test (

  id         int identity,

  date datetimeoffset(7)

insert into #test (date) select getdate()

select * from #test



create table #test2 (

  id         int identity,

  deadline int

insert #test2 (deadline) values(15)
insert #test2 (deadline) values(12)
insert #test2 (deadline) values(8)
insert #test2 (deadline) values(30)

select * from #test2



Нужно новую таблицу заполнить след.образом:
первая строка -
date from #test + deadline from #test2 where id = 1
вторая строка -
(первая строка + deadline from #test2 where id = 2)
третья строка -
(вторая строка + deadline from #test2 where id = 3)
четвертая строка -
(третья строка + deadline from #test2 where id = 4)
18 апр 18, 14:11    [21348904]     Ответить | Цитировать Сообщить модератору
 Re: DateADD и LAG  [new]
court
Member

Откуда:
Сообщений: 1956
Азмузи,

Наличие LAG - принципиально ?
А то с рекурсией всё "просто и крассиво" ...

;with cte as (
	select dateadd(day,t2.deadline,t.date) as date, t2.id 
	from #test t cross join #test2 t2 
	where t2.id=1

	union all

	select dateadd(day,t2.deadline,c.date) as date, t2.id 
	from cte c inner join #test2 t2 on t2.id=c.id+1)

select * from cte order by id  	

dateid
2018-05-03 14:15:40.4800000 +00:001
2018-05-15 14:15:40.4800000 +00:002
2018-05-23 14:15:40.4800000 +00:003
2018-06-22 14:15:40.4800000 +00:004
18 апр 18, 14:24    [21348948]     Ответить | Цитировать Сообщить модератору
 Re: DateADD и LAG  [new]
Азмузи
Member

Откуда:
Сообщений: 9
court,
не принципиально) спасибо большое!
19 апр 18, 07:20    [21350742]     Ответить | Цитировать Сообщить модератору
 Re: DateADD и LAG  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 641
court,
Зачем рекурсия?
или:
SELECT  [t2].[id], DATEADD(DD, [total].[dedline], [t1].[date])
    FROM #test2 [t2]
         CROSS APPLY (SELECT SUM([t22].[deadline]) AS [dedline] FROM #test2 [t22] WHERE [t22].[id] <= [t2].[id]) [total]
         CROSS JOIN #test [t1]
;
или:
SELECT  [t2].[id], DATEADD(DD, SUM([t22].[deadline]), [t1].[date])
    FROM #test2 [t2]
         INNER JOIN #test2 [t22] ON [t22].[id] <= [t2].[id]
         CROSS JOIN #test [t1]
    GROUP BY [t2].[id], [t1].[date]
;
19 апр 18, 07:41    [21350764]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить