我有一个表,其中id为主键,2列为数值。 第一个是时间戳,第二个是值。样品:
id timestamp value
1 10:22 1306
1 10:55 1100
1 10:56 1130
1 11:44 1000
2 10:18 1100
2 11:19 1105
2 11:21 1106
我想对其进行转换,以便为一个id输出所有可能的值组合,其中值在同一小时内,并且起始值的时间戳为<到停止值的时间戳。输出示例:
id hour start_value stop_value
1 10 1306 1100
1 10 1306 1130
1 10 1100 1130
2 11 1105 1106
我尝试使用交叉连接,但是我必须在非常大的表上应用它,并且它需要计算效率。
select v1.id, date_trunc('hour', timestamp), v1.value, v2.value
from table v1
cross join table v2 on date_trunc('hour', v1.timestamp)=date_trunc('hour', v2.timestamp)
where v1.timestamp<v2.timestamp
我怎样才能以有效的方式在Postgresql中做到这一点?
答案 0 :(得分:1)
我认为这就是你想要的:
select v1.id, date_trunc('hour', v1.timestamp), v1.value, v2.value
from t v1 join
t v2
on v1.id = v2.id and
date_trunc('hour', v1.timestamp) = date_trunc('hour', v2.timestamp) and
v1.timestamp < v2.timestamp
where date_trunc('hour', v1.timestamp) = '10:00'::time;
Here是rextester。