【问题标题】:Postgres Sql query for no of records within a time stamp around 30 minPostgresql 在大约 30 分钟的时间戳内查询没有记录
【发布时间】:2017-07-12 19:44:05
【问题描述】:

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

我的 SQL 看起来像:

"从 lk_merged a 中选择 count(distinct(gufi)) 作为 No_of_airplanes 其中 (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) , 时间戳 , No_of planes arround
3432343 , 12:33:89, 1
2565656 , 12:44:45 ,2
3242234 ,1:05:23 ,1

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

谢谢 爱太极

【问题讨论】:

  • 样本数据和所需的输出会有所帮助
  • 您向我们展示了您尝试过的 SQL。你能告诉我们为什么这不起作用,它给你什么,你希望它给你什么?另外,您尝试过的任何其他方法。
  • 您好,欢迎来到 Stack Overflow,请花点时间通过 welcome tour 了解您在此处的方式(并获得您的第一个徽章),阅读如何创建 Minimal, Complete, and Verifiable example并检查How to Ask Good Questions,这样您就有机会获得反馈和有用的答案。
  • 您正在检查时间戳是否在相对于时间戳本身的区间内,这将始终为真......您应该在 between 运算符中使用另一个时间戳。
  • 看起来你在 Go 中编程 :-) 尝试使用这个条件:between ( a.on_actual - interval '20 minutes' and a.on_actual + interval '40 minutes'。您可以在文本变量中设置边界并执行between ( a.on_actual - variable1::interval and a.on_actual + variable2::interval

标签: sql postgresql


【解决方案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
\\

此外,我不确定计数是否应该包括当前行的平面,所以我将其包括在内,但您可以通过在查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-02
    • 2011-06-25
    • 2019-09-12
    • 2013-01-23
    • 1970-01-01
    • 2020-04-12
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多