Sql 将偏移量添加到行以获得单调递增的值
基于此线程(),我有一个额外的要求: 值列表示计数器。 在我的应用程序中,由于一些恼人的原因,计数器值会不时重置,即从零开始。对于数据评估,我需要所有计数的累积值。我的想法是创建一个包含累积值的附加列。 只要不重置,新列的值与原始值列的值相同。重置后,新列的值为最新累积值+当前计数器值。数据中可能会发生多次重置。同样,具有相同“名称”的行属于相同的度量值,必须按meas_日期排序处理 这是原始数据:Sql 将偏移量添加到行以获得单调递增的值,sql,oracle,Sql,Oracle,基于此线程(),我有一个额外的要求: 值列表示计数器。 在我的应用程序中,由于一些恼人的原因,计数器值会不时重置,即从零开始。对于数据评估,我需要所有计数的累积值。我的想法是创建一个包含累积值的附加列。 只要不重置,新列的值与原始值列的值相同。重置后,新列的值为最新累积值+当前计数器值。数据中可能会发生多次重置。同样,具有相同“名称”的行属于相同的度量值,必须按meas_日期排序处理 这是原始数据: id name meas_date value 1 name1 2018/0
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这有帮助吗
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
我想我找到了一个解决方案,它需要两个步骤:
-- 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)
);
步骤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
为什么?如果您只想在输出中看到这一点,请将rownum添加到所选属性。竞争条件太多,无法确定DBMS将从计数器生成单调递增的数字。如果您愿意削弱数据库性能,可以将插入/更新限制为具有自主事务和重锁定的过程。这似乎是一个奇怪的问题,但是,是什么导致“值”字段重置?谨慎的做法难道不是解决这个问题并利用它吗?(假设重置不是故意的)我猜“计数器”这个词是误导性的。我不需要像在行上增加索引那样的计数器,因此rownum没有帮助。计数器值包含试验台上一天(由测量日期指定)发生的事件数。为了评估每个测试台的总体事件、平均每天、每周等,我需要从测量开始到测量每天的累积事件。在某些情况下,重置是有意的,而在其他情况下不是有意的。导致非预期案例的问题将得到解决,但涉及到许多利益相关者,这需要一些时间。从过去开始,我需要处理数百万个测量值,因此我正在寻找上面描述的内容。@Christian-如何获得第4行中的累积值=3?应该是第1行+第2行+第4行中的4=值吗?或者由于度量日期不同而停留在1。抱歉,这没有考虑到并非所有值都必须累加。相反,需要应用偏移量。连续行集的偏移量(相对于测量日期)是所有先前行集的所有“最后”值的总和。此处的集合表示连续行,没有重置值。请显示输出。
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