Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Диапазон дат  [new]
izoldov-roskini
Member

Откуда:
Сообщений: 1169
Есть табличка в виде
Картинка с другого сайта.
Как видно между 2013-01-01 и 2013-03-01 есть пропущенная дата, так вот вопрос, как ее в запросе без курсоров туда затолкать и взять значение колонки "с" из предыдущей строки
27 июн 13, 21:33    [14494371]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
qwerty112
Guest
izoldov-roskini,

рекурсивным цте,
с dt1=min(dt) ==> dt1=dateadd(month, 1, dt1) пока dt1<=max(dt)
27 июн 13, 21:48    [14494415]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
izoldov-roskini
Member

Откуда:
Сообщений: 1169
А с примером не подсобишь по моим данным если не сложно
qwerty112
izoldov-roskini,

рекурсивным цте,
с dt1=min(dt) ==> dt1=dateadd(month, 1, dt1) пока dt1<=max(dt)
27 июн 13, 21:52    [14494421]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
qwerty112
Guest
izoldov-roskini
А с примером не подсобишь по моим данным если не сложно
qwerty112
izoldov-roskini,

рекурсивным цте,
с dt1=min(dt) ==> dt1=dateadd(month, 1, dt1) пока dt1<=max(dt)

даа лехко ))
только "по моим данным" должно быть в соотв.с этим - Рекомендации по оформлению сообщений в форуме п.6
27 июн 13, 21:59    [14494438]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
izoldov-roskini
Member

Откуда:
Сообщений: 1169
Ну так данные на скрине
qwerty112
izoldov-roskini
А с примером не подсобишь по моим данным если не сложнопропущено...

даа лехко ))
только "по моим данным" должно быть в соотв.с этим - Рекомендации по оформлению сообщений в форуме п.6
27 июн 13, 22:00    [14494444]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
qwerty112
Guest
izoldov-roskini
Ну так данные на скрине
qwerty112
пропущено...

даа лехко ))
только "по моим данным" должно быть в соотв.с этим - Рекомендации по оформлению сообщений в форуме п.6

ты мне предлагаешь их "лапами набрать" со скрина ?
27 июн 13, 22:02    [14494452]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
izoldov-roskini
Member

Откуда:
Сообщений: 1169
Допустим вот так

recorddate c
2012-08-01 0.00
2013-01-01 1.00
2013-03-01 0.00
2013-05-01 1.00
2013-06-01 0.00
27 июн 13, 22:02    [14494453]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
qwerty112
Guest
izoldov-roskini
Допустим вот так

recorddate c
2012-08-01 0.00
2013-01-01 1.00
2013-03-01 0.00
2013-05-01 1.00
2013-06-01 0.00

это НЕ "скрипт заполнения тестовыми данными"

ладно, как-то так
;with cte as
(
select min(dt) as xz1, max(dt) as xz2 
from Tab

union all

select dateadd(m,1,xz1), xz2
from cte
where dateadd(m,1,xz1)<=xz2
)

select xz1 from cte order by 1
27 июн 13, 22:11    [14494480]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
izoldov-roskini
Member

Откуда:
Сообщений: 1169
а вот колоночку с числами поля "с" подзабыли :) чтобы число бралось из предыдущей даты
27 июн 13, 22:18    [14494508]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
qwerty112
Guest
izoldov-roskini
а вот колоночку с числами поля "с" подзабыли :) чтобы число бралось из предыдущей даты

я не "подзабыл" - я вполне сознательно на неё "положил",
потому как она к сабжевому вопросу "не играет рояля"

а получить её просто - джойном полученного цте с исх.таб по cte.xz1=dateadd(m,-1,Tab.dt)
27 июн 13, 22:24    [14494533]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
izoldov-roskini
Member

Откуда:
Сообщений: 1169
Да че-то не получаеццо
подсоби если не сложно
27 июн 13, 22:28    [14494553]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
qwerty112
Guest
izoldov-roskini
Да че-то не получаеццо
подсоби если не сложно

14494438
27 июн 13, 22:29    [14494555]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
izoldov-roskini
Member

Откуда:
Сообщений: 1169
Смысл не просто добить даты, но чтобы в колонке "с" было значение предыдущей даты
27 июн 13, 22:31    [14494564]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
CTE гонять? Кажись уже показывали что обычный not exist (или left join) рвёт всё это:
SELECT	X.[Next],D.*
FROM	dbo.DataTable D CROSS APPLY (SELECT DateAdd(Month,1,D.Date)) X ([Next])
WHERE	NOT Exists(SELECT * FROM dbo.DataTable N WHERE N.Date = X.[Next])
-- Видим в плане merge semi join
Не?
27 июн 13, 22:43    [14494593]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
werfqerfe
Guest
izoldov-roskini,

;with
d as
(
select *
from (values
		('20010101 00:00:00.000', 78),
		('20010201 00:00:00.000', 8),
		--('20010301 00:00:00.000', 78),
		('20010401 00:00:00.000', 7),
		('20010501 00:00:00.000', 78),
		('20010601 00:00:00.000', 75),
		('20010701 00:00:00.000', 5),
		--('20010801 00:00:00.000', 7),
		('20010901 00:00:00.000', 0),
		('20011001 00:00:00.000', 1),
		('20011101 00:00:00.000', 3),
		('20011201 00:00:00.000', 2)
	 ) as w(dt, c)
),
t(n) as
(
	select 1 union all select 2
),
q(dt, c, diff) as
(
	select dt, c, isnull(datediff(m, dt, lead(dt) over(order by dt)), 1)
	from d
)
select dateadd(m, t2.n - 1, t1.dt), c
from
	q t1
		cross apply
	(
		select n from t where n <= t1.diff
	) t2


почти линейно
27 июн 13, 22:46    [14494598]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
izoldov-roskini
Member

Откуда:
Сообщений: 1169
Я приведу цитату из моего первого поста:
Как видно между 2013-01-01 и 2013-03-01 есть пропущенная дата, так вот вопрос, как ее в запросе без курсоров туда затолкать и взять значение колонки "с" из предыдущей строки

Я прошу Вас показать как сделать именно это
27 июн 13, 22:48    [14494603]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
qwerty112
Guest
Mnior
CTE гонять? Кажись уже показывали что обычный not exist (или left join) рвёт всё это:
SELECT	X.[Next],D.*
FROM	dbo.DataTable D CROSS APPLY (SELECT DateAdd(Month,1,D.Date)) X ([Next])
WHERE	NOT Exists(SELECT * FROM dbo.DataTable N WHERE N.Date = X.[Next])
-- Видим в плане merge semi join
Не?

и что это было ?
где пропущенные даты ?
+
declare @t table (date datetime, c float)

insert into @t
select '2012-08-01', 0.00 union all
select '2013-01-01', 1.00 union all
select '2013-03-01', 0.00 union all
select '2013-05-01', 1.00 union all
select '2013-06-01', 0.00 

-- select * from @t

SELECT	X.[Next],D.*
FROM	@t D CROSS APPLY (SELECT DateAdd(Month,1,D.Date)) X ([Next])
WHERE	NOT Exists(SELECT * FROM @t N WHERE N.Date = X.[Next])

Next                    date                    c
----------------------- ----------------------- ----------------------
2012-09-01 00:00:00.000 2012-08-01 00:00:00.000 0
2013-02-01 00:00:00.000 2013-01-01 00:00:00.000 1
2013-04-01 00:00:00.000 2013-03-01 00:00:00.000 0
2013-07-01 00:00:00.000 2013-06-01 00:00:00.000 0
27 июн 13, 22:52    [14494611]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
werfqerfe
Guest
izoldov-roskini,

я тебе кинул то что тебе надо, подставь свои данные. и сделай индекс по полю dt... у тебя это поле называется recorddate. если дырки могут быть длиною более одной строки, вставь вместо cte t генератор чисел из твоего вопроса в соседней теме.
27 июн 13, 23:02    [14494641]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
izoldov-roskini
Member

Откуда:
Сообщений: 1169
Ну поясните мне чтобы я понял, что надо дописать:
with cte as
(
select recorddate, rest from RESTS 
union all
 //---- вот тут
		
)
select  * from cte order by cte.recorddate asc

чтобы получился "переходящий остаток"
т.е. если на 01.01.2013 остаток был 5
и если небыло движений в таблицу RESTS в теч. 01.2013,
то остаток на 01.02.2013 тоже должен быть 5, а если в таблице RESTS написано что на 01.02.2013 остаток 3, то должно быть 3
ну напишите плиз , я вообще запутался
27 июн 13, 23:25    [14494715]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
qwerty112
где все пропущенные даты ?
Упс. Мда 10824205 Ну одна дата же заказана
Ну это дело поправимое, но лучше опять таки - таблицу календарь и не парится.
CTE - шмэтеце. Городить огород на ровном месте.
lead(dt) over(order by dt)
Так нечестно. Может у ТС нет 2012(4)-го под рукой.
werfqerfe
генератор чисел CTE
Была темка. 11347386 Так что это всё чисто академически.
27 июн 13, 23:48    [14494791]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
И ещё в довесок:
https://www.sql.ru/forum/972162/poisk-dyrok-v-diapazone
27 июн 13, 23:51    [14494801]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
izoldov-roskini
Member

Откуда:
Сообщений: 1169
я чуть выше четко попросил, что мне надо получить
27 июн 13, 23:52    [14494805]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
И для любителей CTE:
https://www.sql.ru/forum/316343-a/sql2005-populyarnye-zadachi-foruma-i-cte
27 июн 13, 23:53    [14494807]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
izoldov-roskini
я чуть выше четко попросил, что мне надо получить
Вам ответили.
Если чё-то непонятно в приведённых запросах - спрашивайте конкретно.
А "тупо дайте ответ, не хочу думать", то вам сюда.
27 июн 13, 23:57    [14494815]     Ответить | Цитировать Сообщить модератору
 Re: Диапазон дат  [new]
izoldov-roskini
Member

Откуда:
Сообщений: 1169
я же говорю, пробую сделать - не получается, не могу понять как остаток из предыдущей даты поставить на текущую если она пустая
28 июн 13, 00:02    [14494830]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить