Postgresql,返回由另一列分组的一个键的1列的所有组合

时间:2018-06-16 11:35:10

标签: sql postgresql

我有一个表,其中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中做到这一点?

1 个答案:

答案 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。