У меня есть таблица под названием PROD_COST
с 5 полями:Альтернативные отрицательные и положительные значения
(ID, Duration, Cost, COST_NEXT, COST_CHANGE)
Мне нужно дополнительное поле, называемое Groups
для агрегации.
- Продолжительность = количество дней, когда цена действительна (1 день = 1row).
- Цена = цена продукта в этот день.
- -Cost_next = lead (стоимость, 1,0).
- Cost_change = Cost_next - Стоимость.
.
+ ID + Duration + Cost + Next_Cost + Cost_change + Groups+
| 1 | 1 | 10 | 8.5 | -1.5 | 1 |
| 2 | 1 | 8.5 | 12.2 | 3.7 | 2 |
| 3 | 1 | 12.2 | 5.3 | -6.9 | 3 |
| 4 | 1 | 5.3 | 4.2 | 1.2 | 4 |
| 5 | 1 | 4.2 | 6.2 | 2 | 4 |
| 6 | 1 | 6.2 | 9.2 | 3 | 4 |
| 7 | 1 | 9.2 | 7.5 | -2.7 | 5 |
| 8 | 1 | 7.5 | 6.2 | -1.3 | 5 |
| 9 | 1 | 6.2 | 6.3 | 0.1 | 6 |
| 10 | 1 | 6.3 | 7.2 | 0.9 | 6 |
| 11 | 1 | 7.2 | 7.5 | 0.3 | 6 |
| 12 | 1 | 7.5 | 0 | 7.5 | 6 |
+----+----------+------+-----------+-------------+-------+
Мне нужно группе Groups
поля Cost_change
. Он может быть положительным, отрицательным или нулевым.
Добрые ребята посоветовали мне использовать этот код:
Select
id
, COST_CHANGE
, sum(Groups) over (order by id asc) +1
from
(
select
pc.*,
(case when sign(cost_change) - sign(lag(cost_change) over (order by id)) between -1 and 1
then 0
else 1 -- `NULL` intentionally goes here
end) Groups
from Prod_Cost
) pc
Но есть одна проблема: если есть 0 значений между двумя положительными/отрицательными или отрицательных/положительных значений то это группы, которые вместе, например, :
Cost_change Groups
| -5.279 | 33 |
| 5.279 | 34 |
| 0.000 | 34 |
| -5.279 | 34 |
| 0.000 | 34 |
| 5.279 | 34 |
| -8.769 | 35 |
мне нужно иметь:
Cost_change Groups
| -5.279 | 33 |
| 5.279 | 34 |
| 0.000 | 34 |
| -5.279 | 35 |
| 0.000 | 35 |
| 5.279 | 36 |
| -8.769 | 37 |
Второй пример:
Cost_change Groups
| 7.574 | 68 |
| 0.000 | 68 |
| -5.279 | 68 |
| -3.490 | 68 |
Но мне нужно:
Cost_change Groups
| 7.574 | 68 |
| 0.000 | 68 |
| -5.279 | 69 |
| -3.490 | 69 |
Я был бы очень признателен за любую помощь.
Вы можете иметь несколько последовательных нулей (более одного)? Может ли первая строка иметь нуль? Какой конечный результат должен быть в этих случаях? –
Вам необходимо указать нули в своих данных образца, чтобы уточнить, что вы действительно хотите сделать. Что происходит, когда несколько нулей подряд? Что происходит, когда знаки одинаковы с обеих сторон? –
@GordonLinoff, привет Гордон, Вот фрагмент из моих данных http://s000.tinyupload.com/index.php?file_id=59699169718899539984 (ваш запрос). Но мне нужно http://s000.tinyupload.com/?file_id=99257550972254124566 Вы правильно меня поняли о 0 значениях, они должны быть включены в значения +/-, когда мои данные похожи на -8.2; 0; 0; -8.2, тогда ваш запрос группирует его как: 1; 1; 1; 1, и это правильно, потому что последовательность: минус; 0; 0; минус ", но когда мои данные: -8.2; 0; 0; +7.2, то это должно быть 1; 1; 1; 2 becausesequence:" минус; 0; 0; плюс "Im не очень хорошо в Egnlish, но надеюсь вы понимаете меня – RussianBear7