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

Откуда:
Сообщений: 10
Добрый день!
Не могу решить следующую задачу - есть таблица вида

| ID | TYPE | DATE | VALUE
-------------------------------------------
| 21 | 1 | 25.10.2014 | 234
-------------------------------------------
| 22 | 1 | 26.10.2014 | 237
-------------------------------------------
| 23 | 1 | 29.10.2014 | 888
-------------------------------------------
| 24 | 2 | 29.10.2014 | 999
-------------------------------------------
| 25 | 1 | 30.10.2014 | 22

Мне необходимо вернуть все данные, где TYPE = @Type, и самое главное, вернуть за 27.10 и 28.10 значения предыдущего дня, в которой была запись, т.е. на выходе должно быть вот так:

| TYPE | DATE | VALUE
--------------------------------
| 1 | 25.10.2014 | 234
--------------------------------
| 1 | 26.10.2014 | 237
--------------------------------
| 1 | 27.10.2014 | 237
--------------------------------
| 1 | 28.10.2014 | 237
--------------------------------
| 1 | 29.10.2014 | 888
--------------------------------
| 1 | 30.10.2014 | 22

Подскажите куда копать, пожалуйста!
27 апр 16, 12:21    [19112156]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20581
WHERE DATE BETWEEN DATEADD('d',@datefrom,-2) AND DATEADD('d',@datetill,+2)
27 апр 16, 12:38    [19112253]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
Akina
WHERE DATE BETWEEN DATEADD('d',@datefrom,-2) AND DATEADD('d',@datetill,+2)

думаю автору нужно подставить пропущенные даты с последним известным значением до
27 апр 16, 12:56    [19112356]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос?  [new]
jaanq
Member

Откуда:
Сообщений: 10
HandKot, вы абсолютно правы. Забыл также указать, база - MS SQL 14, в запросе еще есть @DateBeg и @DateEnd
27 апр 16, 13:04    [19112406]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос?  [new]
Maxx_UA
Guest
копать понятно куда в таблицу календарь..
27 апр 16, 13:07    [19112420]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос?  [new]
_djХомяГ
Guest
Например создать таблицу календарь (если таковой нет в системе) слефт джойнить ее за необходимый интервал (@beg-@end) с вашей таблицей + воспользоваться LEAD/LAG
27 апр 16, 13:08    [19112421]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос?  [new]
jaanq
Member

Откуда:
Сообщений: 10
_djХомяГ, в принципе так я и делаю, но вопрос в том, что LAG() будет работать только если пропущен один день. А если пропущено два дня - для второго он вернет мне NULL
27 апр 16, 13:23    [19112499]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20581
Умножьте рабочую таблицу на опорную и отберите те записи, для которых разность дат минимальна, но неотрицательна - для имеющихся записей получится та же дата, для отсутствующих ближайшая существующая. По полученной дате получите и значение.
А рекурсия тут не нужна...
27 апр 16, 13:26    [19112527]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос?  [new]
_djХомяГ
Guest
declare @t table (d date,val int)

insert into @t values('20160101',1),('20160102',2),('20160104',4),('20160107',7)

select t.*,c.val from @t t outer apply (select top 1 val from @t t1 where t1.d>t.d) c(val)
27 апр 16, 13:27    [19112537]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20581
_djХомяГ, в подзапросе ORDER BY забыт.
27 апр 16, 13:30    [19112554]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос?  [new]
_djХомяГ
Guest
Akina Ваша правда
27 апр 16, 13:34    [19112577]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос?  [new]
jaanq
Member

Откуда:
Сообщений: 10
_djХомяГ, спасибо огромное!
В подзапросе еще добавил ORDER BY DESC и VAL IS NOT NULL и все заработало как надо!
27 апр 16, 14:20    [19112794]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить