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

Откуда:
Сообщений: 14
Добрый день всем,
Есть таблица Cost_prod в которой пытаюсь сгруппировать строки по изменению стоимости продуктов (отрицательное-положительное-отрицательное, 0 - группируется с последним положительным/отрицательным значением). Написал запрос, который все делает хорошо за одним исключением: в случае, если между двумя положительными или отрицательными значениями стоит 0, группировка происходит с ошибкой, в примере должно быть 4.433 - 371 ; 0.000 - 371; 0.000 - 371; 13.944 - 371; -5.279 - 372 ; То есть чередование значений с игнорированием нулей.

Запрос:
select id,cost_change,sum(Groups)over(order by id asc)+1
from
(select *,case when sign(cost_change != sign(lag(cost_change) over (order by id asc)) and Cost_change!=0 then 1 else 0
end as Groups
from COST_PROD) x

К сообщению приложен файл. Размер - 19Kb
30 авг 15, 12:44    [18088100]     Ответить | Цитировать Сообщить модератору
 Re: Чередование положительных/отрицательных значений  [new]
RUSSIANBEAR7
Member

Откуда:
Сообщений: 14
Поля в прикрепленном файле: Cost_change, Groups
30 авг 15, 12:46    [18088104]     Ответить | Цитировать Сообщить модератору
 Re: Чередование положительных/отрицательных значений  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4901
RUSSIANBEAR7,

Я подозреваю, что у вас LAG дает NULL и срабатывает принцип

SELECT 0 WHERE 1 != NULL


строк не вернёт
31 авг 15, 11:02    [18089995]     Ответить | Цитировать Сообщить модератору
 Re: Чередование положительных/отрицательных значений  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
RUSSIANBEAR7
0 - группируется с последним положительным/отрицательным значением).
declare @t table (id int identity primary key, cc int);
insert into @t values (1), (2), (0), (-1), (2), (0), (-3), (0), (0), (0), (0), (0), (1);

select
 id, cc, sum(case when cc = 0 or sign(cc) = sign(cc_prev) then 0 else 1 end) over (order by id)
from
 (select *, lag(cc, 1, cc) over (order by id) as cc_prev from @t) t;

?
31 авг 15, 12:30    [18090448]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить