Sha*_*baz 2 sql hive lag window-functions
我觉得我有一个相当简单的SQL问题要解决,只是不知道如何正确地搜索它。
假设我有一张表格,其中的值是根据时间更新的:
|timestamp|value|session|
|---------|-----|-------|
| ts1 | v1 | s1 |
| ts2 | v2 | s1 |
| ts3 | v3 | s1 |
| ... | .. | s2 |
Run Code Online (Sandbox Code Playgroud)
我想获取当前值和以前的值以及相关的时间戳。
因此结果应为:
|timestamp_current|value_current|timestamp_prev|value_prev|
|-----------------|-------------|--------------|----------|
| ts2 | v2 | ts1 | v1 |
| ts3 | v3 | ts2 | v2 |
| ... | .. | ... | .. |
Run Code Online (Sandbox Code Playgroud)
我认为以下查询是正确的,如果我只是想获取先前的值,而不是先前的时间戳:
select timestamp, value, lag(value,1) over (partition by (session) order by timestamp)
from mytable
但是,从上一行中添加两个值的正确方法是什么,是否添加两个lag子句,还是有更好的方法?
您可以使用lag()两次来得出结果。一次prev_timestamp,一次prev_val如下。
select * from
(
select timestamp,
value,
lag(timestamp) over(partition by session order by timestamp) as prev_timestamp,
lag(value) over(partition by session order by timestamp) as prev_value
from table1
) t
where prev_timestamp is not null
Run Code Online (Sandbox Code Playgroud)
where子句用于排除具有prev_timestampas的行NULL
结果:
+-----------+-------+----------------+------------+
| timestamp | value | prev_timestamp | prev_value |
+-----------+-------+----------------+------------+
| ts2 | v2 | ts1 | v1 |
| ts3 | v3 | ts2 | v2 |
+-----------+-------+----------------+------------+
Run Code Online (Sandbox Code Playgroud)