Postgres sql查询大约30分钟内的时间戳内没有记录

问题描述:

我想写一个Postgres sql,它会让我在特定时间戳的30分钟内的航班。Postgres sql查询大约30分钟内的时间戳内没有记录

我的SQL是这样的:

“选择计数从lk_merged(不同(gufi))作为No_of_airplanes一个 其中(a.on_actual(a.on_actual之间 - (20 *间隔 '1 MINUTE'))和(a.on_actual +(40 *间隔'1分钟'))) group by a.on_actual“

请建议如何获得飞机的no。

我的表格有gufi作为飞机ID on_actual_timelanding。

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

输出应该像,用新的柱表明no_of_planes_around 20分钟内之前和时间戳

Gufi(plane_id),时间标记后,No_of平面角落找寻
3432343,12:33:89,1
2565656,12点44分: 2,
3242234,1:05:23,1

如果可能,请不要自行加入。

感谢 爱特亚吉

+2

示例数据和期望的输出将会有所帮助 –

+0

您向我们展示了您尝试过的SQL。你能告诉我们为什么这不起作用,它给你什么,以及你希望它给你什么?另外,你试过的其他东西。 – jmelesky

+0

嗨,欢迎来到Stack Overflow,请花点时间阅读[欢迎导览](https://*.com/tour)以了解您在这里的方式(并获得您的第一张徽章),请阅读如何创建一个[Minimal,Complete和Verifiable示例](https://*.com/help/mcve)并检查[如何提出好问题](https://*.com/help/how-to-ask ),所以你增加了获得反馈和有用答案的机会。 – DarkCygnus

II是不可能的,如果使用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 “在查询中处于活动状态。