SQL脚本可查找先前的值,而不必查找先前的行

时间:2018-08-23 13:04:38

标签: sql hana

SQL中是否有一种方法可以在同一SELECT语句中查找先前的值,而不必在先前的行中?

请参见下图。我想添加另一列ELAPSED,该列计算TIMERSTART之间的时间差,但是仅当DEVICEID相同且I_TYPE为viewDisplayed时。例如从2减去1,将差异存储在3中,将0存储在4中,因为i_type不是viewDisplayed,从5减去2,在存储差异中存储6,依此类推。

它必须是一条语句,在这种情况下,我不能使用存储过程。

SELECT DEVICEID, I_TYPE, TIMERSTART,
 O AS ELAPSED -- CASE WHEN <CONDITION> THEN TIMEDIFF() ELSE 0 END AS ELAPSED
FROM CLIENT_USAGE
ORDER BY TIMERSTART ASC

我正在使用SAP HANA DB,但它的工作原理与最新版本的MS-SQL非常相似。因此,如果您知道如何使其在SQL中运行,我可以使其在HANA中运行。

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以进行子查询,以查找在有关行之前输入的最后一次时间。

select deviceid, i_type, timerstart, (timerstart - timerlast) as elapsed.
from CLIENT_USAGE CU
join ( select top 1 timerstart as timerlast
       from CLIENT_USAGE C 
       where (C.i_type = CU.i_type) and 
         (C.deviceid = CU.deviceid) and (C.timerstart < CU.timerstart)
       order by C.timerstart desc 
     ) as temp1
on temp1.i_type = CU.i_type
order by timerstart asc

这是sql看起来的粗略草图,如果它是i_type或i_type和deviceid,则我不知道该表上的主键是什么。但这应有助于如何至少计算字段。我认为没有必要存储该值,除非此表非常大或所使用的硬件非常慢。每次运行此查询时,都可以很容易地计算出来。

答案 1 :(得分:0)

SAP HANA支持窗口功能:

select DEVICEID,
       TIMERSTART, 
       lag(TIMERSTART) over (partition by DEVICEID order by TIMERSTART) as previous_start
from CLIENT_USAGE

然后,您可以将其包装在括号中,并根据您的内心要求处理数据