我觉得我有一个相当简单的sql问题要解决,只是不知道如何正确地搜索它。
假设我有一个基于时间更新值的表:
|timestamp|value|session|
|---------|-----|-------|
| ts1 | v1 | s1 |
| ts2 | v2 | s1 |
| ts3 | v3 | s1 |
| ... | .. | s2 |
我想得到当前值和前一个值以及相关的时间戳。
所以结果应该是:
|timestamp_current|value_current|timestamp_prev|value_prev|
|-----------------|-------------|--------------|----------|
| ts2 | v2 | ts1 | v1 |
| ts3 | v3 | ts2 | v2 |
| ... | .. | ... | .. |
如果我只想获取上一个值,而不是上一个时间戳,那么我认为下面的查询是正确的: select timestamp, value, lag(value,1) over (partition by (session) order by timestamp) from mytable
但是,从上一行中添加两个值的正确方法是什么?我是添加两个lag子句还是有更好的方法?
2条答案
按热度按时间tquggr8v1#
你可以用
lag()
两次;一次prev_timestamp
就一次prev_val
如下所示。+-----------+-------+----------------+------------+
| timestamp | value | prev_timestamp | prev_value |
+-----------+-------+----------------+------------+
| ts2 | v2 | ts1 | v1 |
| ts3 | v3 | ts2 | v2 |
+-----------+-------+----------------+------------+
py49o6xq2#
实现这一点的另一种方法是使用row\u number函数并连接如下所示的记录。。但是在同一个查询中使用两个lag方法很可能比row\ u number和left join方法性能更好。