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

Откуда:
Сообщений: 7
Народ нужна помощь, не получается решить запросом задачку.
есть таблица, например
date Val
01.01.2017 5
01.02.2017 2
01.03.2017 3
01.04.2017 -2
01.05.2017 -1
01.06.2017 0
01.07.2017 2
01.08.2017 5
01.09.2017 1
01.10.2017 -3
01.11.2017 -2
01.12.2017 2
01.01.2018 4
01.02.2018 6
01.03.2018 5
01.04.2018 -2
01.05.2018 -5
01.06.2018 2
01.07.2018 1
01.08.2018 -4
01.09.2018 -2
01.10.2018 -3
нужно найти количество месяцев подряд где VAL<0, то есть именно последний интервал! в данном примере это 3, но как это сделать запросом? прошу помощи Спасибо!
7 дек 18, 10:50    [21756749]     Ответить | Цитировать Сообщить модератору
 Re: последний Непрерывный интервал где...  [new]
court
Member

Откуда:
Сообщений: 1531
m.netda,

sign-ом по Val получаешь новую колонку "знака Val"
затем, определяешь инвариант - интервал постоянного значения "знака Val"
и дальше, через count(*)over(partition by inv) - получаешь "количество месяцев подряд где VAL<0" для этих интервалов

Всё просто :)
7 дек 18, 11:21    [21756771]     Ответить | Цитировать Сообщить модератору
 Re: последний Непрерывный интервал где...  [new]
invm
Member

Откуда: Москва
Сообщений: 8220
with t as
(
 select
  [date], Val, datediff(month, dateadd(month, row_number() over (order by [date]), '1900'), [date]) as g
 from
  [есть таблица]
 where
  Val < 0
)
select top (1)
 max([date]), count(*)
from
 t
group by
 g
order by
 max([date]) desc;
7 дек 18, 11:22    [21756772]     Ответить | Цитировать Сообщить модератору
 Re: последний Непрерывный интервал где...  [new]
court
Member

Откуда:
Сообщений: 1531
;with cte as (
	select 
		*
		,sgn	=sign(Val) 
		,inv	=row_number()over(order by [date])-row_number()over(partition by sign(Val) order by [date]) 
	from @t
)
select top 1 with ties
	*
	,count(*)over(partition by inv)
from cte
where sgn=-1
order by count(*)over(partition by inv) desc
7 дек 18, 11:29    [21756783]     Ответить | Цитировать Сообщить модератору
 Re: последний Непрерывный интервал где...  [new]
court
Member

Откуда:
Сообщений: 1531
m.netda
последний Непрерывный интервал где...

...а я понял как максимальный
тогда так

court
;with cte as (
	select 
		*
		,sgn	=sign(Val) 
		,inv	=row_number()over(order by [date])-row_number()over(partition by sign(Val) order by [date]) 
	from @t
)
select top 1 with ties
	*
	,count(*)over(partition by inv)
from cte
where sgn=-1
order by inv desc
7 дек 18, 11:45    [21756803]     Ответить | Цитировать Сообщить модератору
 Re: последний Непрерывный интервал где...  [new]
m.netda
Member

Откуда:
Сообщений: 7
Получилось решить через
select max(t1.date), count(*)
from
(select date, val,
,dateAdd ("mm",-row_nomber() over (order by val), date) as [group]
from tabel
where val<0) t1
group by [group]
having max(t1.date)='01.10.2018'

Всем спасибо за варианты, обязательно разберу их
7 дек 18, 12:13    [21756850]     Ответить | Цитировать Сообщить модератору
 Re: последний Непрерывный интервал где...  [new]
aleks222
Member

Откуда:
Сообщений: 339
Редкостный бред. Шоб найти ОДИН, ПОСЛЕДНИЙ - группируют ВСЮ таблицу.

Ужос, летящий в пустоте мозга.

declare @t table( date datetime primary key, val int, unique(val, date));
insert @t select '01.03.2018', 5
insert @t select '01.04.2018', -2
insert @t select '01.05.2018', -5
insert @t select '01.06.2018', 2
insert @t select '01.07.2018', 1
insert @t select '01.08.2018', -4
insert @t select '01.09.2018', -2
insert @t select '01.10.2018', -3
--insert @t select '01.11.2018', 3
;

with t as ( select * from @t )
    ,  e as ( select top(1) * from t where Val < 0 order by date desc )
    ,  b as  ( select top(1) * from t where Val >= 0 and date < ( select date from e) order by date desc )
 select * from t where ( select date from b) < date and date <= ( select date from e) 
;
7 дек 18, 16:24    [21757268]     Ответить | Цитировать Сообщить модератору
 Re: последний Непрерывный интервал где...  [new]
m.netda
Member

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

Если можешь поделись опытом буду только благодарен.
Полная задача в следующем имеется например 10 продуктов и по каждому набор значений VAL на каждый месяц за два года.
нужно запросом получить результат
продукт, количество месяцев подряд, где VAL<0 на дату отчета 01.10.2018

в идеале если значений VAL<0 по продукту нет то, чтобы по нему выводилось 0
7 дек 18, 16:50    [21757333]     Ответить | Цитировать Сообщить модератору
 Re: последний Непрерывный интервал где...  [new]
m.netda
Member

Откуда:
Сообщений: 7
aleks222,

А то, что группировку использовать не рационально, я в курсе, просто по другому не знаю как.
7 дек 18, 16:51    [21757337]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить