从PostgreSQL获取行示例
我有一个带有时间戳的数据表和一些数据列。行以任意时间间隔插入,即连续行的时间戳差异不稳定,但范围为几秒到几小时 如果有,我需要为固定长度的每个时间间隔选择一行 范例 为了获得选择的时间间隔,我有一个生成时间间隔表的函数,例如:从PostgreSQL获取行示例,sql,postgresql,Sql,Postgresql,我有一个带有时间戳的数据表和一些数据列。行以任意时间间隔插入,即连续行的时间戳差异不稳定,但范围为几秒到几小时 如果有,我需要为固定长度的每个时间间隔选择一行 范例 为了获得选择的时间间隔,我有一个生成时间间隔表的函数,例如: start_time end_time '2021-05-31 10:00:00' '2021-05-31 10:10:00' '2021-05-31 10:10:00' '2021-05-31 10:20:00' '2021-05-31
start_time end_time
'2021-05-31 10:00:00' '2021-05-31 10:10:00'
'2021-05-31 10:10:00' '2021-05-31 10:20:00'
'2021-05-31 10:20:00' '2021-05-31 10:30:00'
然后,对于此源数据:
timestamp data
'2021-05-31 10:01:00' 1
'2021-05-31 10:02:00' 2
'2021-05-31 10:05:00' 3
'2021-05-31 10:21:00' 4
我要求结果:
timestamp data
'2021-05-31 10:01:00' 1
'2021-05-31 10:21:00' 4
将为第一个间隔选择三行中的第一行
没有为第二个间隔选择任何行
为第三个间隔选择第一行,也是唯一可能的行
谢谢您可以尝试按时间间隔加入您的表,按时间间隔排序,并获得不同的开始时间、结束时间。下面的示例创建时间间隔并将其与表t关联: 演示:
您可以尝试以时间间隔加入表,按时间间隔排序,并获得不同的开始时间、结束时间。下面的示例创建时间间隔并将其与表t关联: 演示:
可以使用横向连接在每个间隔拾取一行:
select *
from get_intervals() i
cross join lateral
(
select *
from my_table t
where t.timestamp >= i.start_time and t.timestamp < i.end_time
order by t.timestamp -- or by something random?
fetch first row only
) d;
首先想到的是横向连接。首先连接所有行,然后使用DISTINCT ON,可能会产生较大的中间结果,因此我更喜欢横向连接而不是这种方法。您可以使用横向连接在每个间隔中选择一行:
select *
from get_intervals() i
cross join lateral
(
select *
from my_table t
where t.timestamp >= i.start_time and t.timestamp < i.end_time
order by t.timestamp -- or by something random?
fetch first row only
) d;
首先想到的是横向连接。首先连接所有行,然后使用DISTINCT ON,可能会产生较大的中间结果,因此我更喜欢横向连接而不是这种方法。@Pavel Bazika:谢谢您的编辑。我经常忘记派生表的别名,因为我使用的是Oracle,它不是强制性的。是的,我错过了ON条款;我现在已将内部连接更改为交叉连接。@Pavel Bazika:谢谢您的编辑。我经常忘记派生表的别名,因为我使用的是Oracle,它不是强制性的。是的,我错过了ON条款;我现在已将内部连接更改为交叉连接。
select *
from get_intervals() i
cross join lateral
(
select *
from my_table t
where t.timestamp >= i.start_time and t.timestamp < i.end_time
order by t.timestamp -- or by something random?
fetch first row only
) d;