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中运行。
答案 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
然后,您可以将其包装在括号中,并根据您的内心要求处理数据