powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / последний Непрерывный интервал где...
9 сообщений из 9, страница 1 из 1
последний Непрерывный интервал где...
    #39744079
m.netda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ нужна помощь, не получается решить запросом задачку.
есть таблица, например
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, но как это сделать запросом? прошу помощи Спасибо!
...
Рейтинг: 0 / 0
последний Непрерывный интервал где...
    #39744094
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m.netda,

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

Всё просто :)
...
Рейтинг: 0 / 0
последний Непрерывный интервал где...
    #39744095
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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;
...
Рейтинг: 0 / 0
последний Непрерывный интервал где...
    #39744104
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
;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
...
Рейтинг: 0 / 0
последний Непрерывный интервал где...
    #39744122
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m.netda последний Непрерывный интервал где...
...а я понял как максимальный
тогда так

court
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
;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
...
Рейтинг: 0 / 0
последний Непрерывный интервал где...
    #39744161
m.netda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получилось решить через
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'

Всем спасибо за варианты, обязательно разберу их
...
Рейтинг: 0 / 0
последний Непрерывный интервал где...
    #39744424
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Редкостный бред. Шоб найти ОДИН, ПОСЛЕДНИЙ - группируют ВСЮ таблицу.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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) 
;
...
Рейтинг: 0 / 0
последний Непрерывный интервал где...
    #39744453
m.netda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,
Может и бред, но поскольку у меня по факту присутствует еще одно измерение, пусть будет продукт, то способ с группировкой показался проще, ну если честно по другому и не знаю как.

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

в идеале если значений VAL<0 по продукту нет то, чтобы по нему выводилось 0
...
Рейтинг: 0 / 0
последний Непрерывный интервал где...
    #39744456
m.netda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

А то, что группировку использовать не рационально, я в курсе, просто по другому не знаю как.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / последний Непрерывный интервал где...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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