Oracle 根据上一行或下一行计算总和

Oracle 根据上一行或下一行计算总和,oracle,Oracle,我正在使用oracle中的一些数据,这些数据对于我需要进行的计算来说有点不完整。 该表如下所示(客户不是唯一的): 我想做的是获取以下数据: Customer (grouped by) | status | days in status (sum for customer as status) 其中status是从下一行的日期中减去一行的日期。相同的状态可能重复出现,有时连续出现,有时不连续出现。如果没有其他行,我想使用当前日期进行计算 所以本质上,它是 select customer, S

我正在使用oracle中的一些数据,这些数据对于我需要进行的计算来说有点不完整。 该表如下所示(客户不是唯一的):

我想做的是获取以下数据:

Customer (grouped by) | status | days in status (sum for customer as status) 
其中status是从下一行的日期中减去一行的日期。相同的状态可能重复出现,有时连续出现,有时不连续出现。如果没有其他行,我想使用当前日期进行计算

所以本质上,它是

select customer,
SUM(CASE WHEN status_From LIKE 'A%' THEN (?Date of next row?) - date_of_change ELSE 0 END) AS DaysAsA,
from Log
GROUP BY customer
有没有一种方法可以在oracle中实现这一点,而不必执行多个查询(在coldfusion中)并循环执行它们

使用lead()分析函数检索下一行的值:

select
  ..
  ,lead(t.status, 1, 0) over(order by t.status) nextStatus
from
  table1 t

包含一些示例数据和您期望的结果会很有帮助。这听起来像是一个缺口和孤岛问题,但我不确定您希望如何处理状态更改的日期以及日期中的缺口。这很好,但我尝试了lead(date_Of_Change,1,NOW())认为NOW()是默认值,并收到了一个无效标识符错误。如果没有其他行,我怎么能让它现在给我?现在是什么()?您的意思可能是sysdate()?我如何确保它不会抓住客户不匹配的下一行?无论如何,over子句中的按客户划分似乎可以做到这一点。
select
  ..
  ,lead(t.status, 1, 0) over(order by t.status) nextStatus
from
  table1 t