Добавьте смещение к строкам, чтобы получить монотонно увеличивающиеся значения - PullRequest
0 голосов
/ 01 мая 2018

на основе этого потока ( Проверка строк на монотонно увеличивающиеся значения ), у меня есть дополнительное требование: Столбец значения представляет счетчик. В моем приложении по какой-то раздражающей причине время от времени значение счетчика сбрасывается, то есть начинается с нуля. Для оценки данных мне нужно накопленное значение всех подсчетов. Моя идея заключалась в том, чтобы создать дополнительный столбец, который содержит накопленную стоимость. Пока сброс не происходит, значение нового столбца совпадает со значением исходного столбца. После сброса значением нового столбца является последнее накопленное значение + текущее значение счетчика. Многократные сбросы могут произойти в данных. Еще раз, строки с одинаковым «именем» принадлежат одному и тому же измерению и должны обрабатываться, отсортированные по measure_date.

Это исходные данные:

id   name   meas_date   value
1    name1  2018/01/01  1
2    name1  2018/01/02  2
3    name2  2018/01/04  2
4    name1  2018/01/03  1
5    name1  2018/01/04  5
6    name2  2018/01/05  4
7    name2  2018/01/06  2
8    name1  2018/01/05  2

Желаемый результат будет

id   name   meas_date   value  accumulated_value
1    name1  2018/01/01  1      1
2    name1  2018/01/02  2      2
3    name2  2018/01/04  2      2
4    name1  2018/01/03  1      3 
5    name1  2018/01/04  5      7
6    name2  2018/01/05  4      4
7    name2  2018/01/06  2      6
8    name1  2018/01/05  2      9

Функция LAG из упомянутого выше потока действительно полезна для поиска строк, в которых значение счетчика было сброшено. Но сейчас я пытаюсь совместить это с накоплением значений, чтобы получить общие значения счетчиков.

Большое спасибо,

Christian

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Полагаю, я нашел решение, которое состоит из двух шагов:

-- 1. set flag column = 2 for all rows with values right before an reset
update TEST dst set dst.flag = (
  with src as (
    SELECT id, name, value,
    CASE WHEN value < value_next THEN 0 ELSE 2 END AS flag
    FROM (
      SELECT id, name, value,
      LEAD(value, 1, 0) OVER (PARTITION BY name order by meas_date) AS value_next
      FROM TEST
    )      
  )
  select src.flag from src where dst.id = src.id
) 

-- 2. Use SQL for Modeling to calculate the accumulated values
SELECT  name, meas_date, value, offset, value+offset as accumulated_value
FROM TEST 
MODEL RETURN UPDATED ROWS
 PARTITION BY (name) 
 DIMENSION BY (meas_date, flag)
 MEASURES (value, 0 as offset)
 RULES (
  offset[meas_date, ANY] ORDER BY meas_date = NVL(sum(NVL(value,0))[meas_date < CV(meas_date), flag=2],0) 
 ); 

После шага 1:

id  name    meas_date   value flag
1   name1   01.01.18    1     0
2   name1   02.01.18    2     2
3   name2   04.01.18    2     0
4   name1   03.01.18    1     0
5   name1   04.01.18    5     2
6   name2   05.01.18    4     2
7   name2   06.01.18    2     2
8   name1   05.01.18    2     2

Вывод шага 2

name    meas_date   value  offset  accumulated_value
name1   01.01.18    1      0       1
name1   02.01.18    2      0       2
name1   03.01.18    1      2       3
name1   04.01.18    5      2       7
name1   05.01.18    2      7       9
name2   04.01.18    2      0       2
name2   05.01.18    4      0       4
name2   06.01.18    2      4       6
0 голосов
/ 01 мая 2018

Это полезно?

select id, name, meas_date, value,  sum(value) over(partition by meas_date order by meas_date, value )  from #temp 
group by id, name, meas_date, value
order by meas_date,   value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...