我正在尝试编写一个Postgres sql,它将在特定时间戳的30分钟内为我提供航班。
我的SQL看起来像:
"从lk_merged a中选择计数(distinct(gufi))为No_of_airplanes where(a.on_actual介于(a.on_actual - (20 * interval' 1分钟')之间)和(a.on_actual +(40 * interval' 1分钟'))) 由a.on_actual"
组成请建议如何让这些没有飞机。
我的桌子上有gufi作为飞机id,on_actual_timelanding。
我有什么: gufi(plane_id),时间输出应该是这样的,在时间戳之前和之后的20分钟内有一个新列建议no_of_planes_around
Gufi(plane_id),时间戳,No_of飞机周围 3432343,12:33:89,1 2565656,12:44:45,2 3242234,1:05:23,1
如果没有自我加入,请提出建议。
由于 爱Tyagi
答案 0 :(得分:0)
如果使用COUNT()作为窗口函数,则不能使用COUNT(DISTINCT ...),如果你试图得到错误" 0A000:DISTINCT没有实现窗口函数& #34 ;.因此,为了计算这个计数的不同,并在每行输出上输出,我建议使用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
\\
此外,我还不确定计数是否应包含当前行的平面,因此我将其包括在内,但您可以通过制作行&#34;和t1.plane_id&lt;&gt;来排除它。 t2.plane_id&#34;在查询中处于活动状态。