postgrePostgres Sql 查询时间戳内大约 30 分钟的记录数



我正在尝试编写一个Postgres sql,它将在特定时间戳的30分钟内为我提供航班。

我的SQL看起来像:

"选择 count(distinct(gufi(( 作为No_of_airplanes 从 lk_merged a 其中(a.on_actual介于 (a.on_actual -(20* 间隔"1 分钟"((和 (a.on_actual +(40 * 间隔"1 分钟"(( ( ( 分组依据a.on_actual">

请建议如何获得这些飞机的数量。

我的桌子有gufi作为飞机ID,on_actual_timelanding。

我有什么 : gufi(plane_id( , 时间
3432343,12:33:89
2565656,12:44:45 3242234,1:05
:23

输出应如下所示,新列建议在时间戳前后 20 分钟内no_of_planes_around

Gufi(plane_id( , 时间戳 , 3432343周围的
No_of平面 , 12:33:89, 1 2565656 , 12:44:45 ,2
3242234 ,1:05:23 ,1

如果可能的话,请在没有自我加入的情况下提出一些建议。

谢谢 爱泰吉

如果使用 COUNT(( 作为窗口函数,则无法使用COUNT(DISTINCT ...(,如果您尝试,则会出现错误"0A000:DISTINCT 未为窗口函数实现"。因此,要以不同的方式计算此计数,并在每行输出上输出,我建议使用 CROSS JOIN LATERAL。

请注意,在您的小数据示例中,我不确定 1:05:23 = 01:05:23 或 13:05:23,所以我同时包含两者。

CREATE TABLE mytable(
plane_id   INTEGER  NOT NULL 
,plane_time TIME NOT NULL
)
\
INSERT INTO mytable(plane_id,plane_time) VALUES (3432343,TO_TIMESTAMP('12:33:89', 'HH24:MI:SS')::TIME)\
INSERT INTO mytable(plane_id,plane_time) VALUES (2565656,TO_TIMESTAMP('12:44:45', 'HH24:MI:SS')::TIME)\
INSERT INTO mytable(plane_id,plane_time) VALUES (3242234,TO_TIMESTAMP('01:05:23', 'HH24:MI:SS')::TIME)\
INSERT INTO mytable(plane_id,plane_time) VALUES (3242234,TO_TIMESTAMP('13:05:23', 'HH24:MI:SS')::TIME)\
select * 
from mytable t1
cross join lateral (
select count(distinct plane_id) No_of_planes_around
from mytable t2 
where t2.plane_time between t1.plane_time - interval '20 minutes' and t1.plane_time + interval '40 minutes'
--and t1.plane_id <> t2.plane_id
) cjl
\

此外,我不确定计数是否应包括当前行的平面,所以我包括了它,但是您可以通过在查询中激活行"和t1.plane_id <> t2.plane_id"来排除它。

最新更新