如何在两列中使用Hive sql的lag函数?

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子句,还是有更好的方法?

zar*_*ruq 5

您可以使用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)

演示