Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将偏移量添加到行以获得单调递增的值_Sql_Oracle - Fatal编程技术网

Sql 将偏移量添加到行以获得单调递增的值

Sql 将偏移量添加到行以获得单调递增的值,sql,oracle,Sql,Oracle,基于此线程(),我有一个额外的要求: 值列表示计数器。 在我的应用程序中,由于一些恼人的原因,计数器值会不时重置,即从零开始。对于数据评估,我需要所有计数的累积值。我的想法是创建一个包含累积值的附加列。 只要不重置,新列的值与原始值列的值相同。重置后,新列的值为最新累积值+当前计数器值。数据中可能会发生多次重置。同样,具有相同“名称”的行属于相同的度量值,必须按meas_日期排序处理 这是原始数据: id name meas_date value 1 name1 2018/0

基于此线程(),我有一个额外的要求: 值列表示计数器。 在我的应用程序中,由于一些恼人的原因,计数器值会不时重置,即从零开始。对于数据评估,我需要所有计数的累积值。我的想法是创建一个包含累积值的附加列。 只要不重置,新列的值与原始值列的值相同。重置后,新列的值为最新累积值+当前计数器值。数据中可能会发生多次重置。同样,具有相同“名称”的行属于相同的度量值,必须按meas_日期排序处理

这是原始数据:

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