Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PostgreSQL获取行示例_Sql_Postgresql - Fatal编程技术网

从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;