当前位置: 首页 > 面试题库 >

MySQL / Postgres查询5分钟间隔数据

司寇昱
2023-03-14
问题内容

我需要查询方面的帮助,比方说这是表中的数据。

timestamp           
------------------- 
2010-11-16 10:30:00
2010-11-16 10:37:00
2010-11-16 10:40:00 
2010-11-16 10:45:00
2010-11-16 10:48:00
2010-11-16 10:55:00
2010-11-16 10:56:00

我想获得至少比最后一行晚5分钟的每一行(时间戳)。在这种情况下,查询应返回:

timestamp           
------------------- 
2010-11-16 10:30:00
2010-11-16 10:37:00
2010-11-16 10:45:00
2010-11-16 10:55:00

问题答案:

递归CTE

由于每一行都取决于之前的一行,因此很难使用基于集合的方法来解决。求助于递归CTE(这是标准SQL):

WITH RECURSIVE cte AS (
   (SELECT ts FROM tbl
    ORDER  BY ts
    LIMIT  1)

   UNION ALL
   (SELECT t.ts
    FROM   cte c
    JOIN   tbl t ON t.ts >= c.ts + interval '5 min'
    ORDER  BY t.ts
    LIMIT  1)
   )
SELECT * FROM cte ORDER BY ts;

请注意我的初稿中的更新:
递归CTE中不允许使用聚合函数。我用ORDER BY/代替,当/上LIMIT 1索引 支持时应该很快ts

UNION查询每条腿周围的括号对于允许是必须的LIMIT,否则将仅在UNION查询结束时允许一次。

PL / pgSQL函数

遍历已排序表的过程解决方案(带有plpgsql函数的示例)可能会快很多,因为它可以通过单个表扫描来解决:

CREATE OR REPLACE FUNCTION f_rowgrid(i interval)
  RETURNS SETOF timestamp AS
$func$
DECLARE
   _this  timestamp;
   _last  timestamp := '-infinity';     -- init so that 1 row passes
BEGIN

FOR _this IN
    SELECT ts FROM tbl ORDER BY 1
LOOP
    IF _this >= _last + i THEN
       RETURN NEXT _this;
       _last := _this;
    END IF;
END LOOP;

END
$func$ LANGUAGE plpgsql;

称呼:

SELECT * FROM  f_rowgrid('5 min')

SQL Fiddle 演示了两者。



 类似资料:
  • 问题内容: 我有一个监视系统,它每n秒收集一次数据(n大约为10,但有所不同)。我想每隔15分钟汇总一次收集的数据。有没有一种方法可以将时间戳记值合并为15分钟的块,以便分组工作? 问题答案:

  • 问题内容: 我想创建一个Ecto查询,该查询按表的年龄(即“最小年龄(月)->最大年龄(月)”)过滤表中的记录。 一种简单的方法是Ecto功能: 这样做的问题是,并非所有孩子都在同一时区,当然也不是所有孩子都在同一时区。该查询将非常接近,但没有发现(有些会在一天之内关闭)。 我一直在尝试使用PostgreSQL的功能来使此查询工作。我可以使用SQL客户端使其正常工作,但是在尝试对片段中的值进行插值

  • 问题内容: 我有一个天气数据库,它大约每70秒获取一次数据集(取决于气象站何时发送数据)。 我想使用Pchart绘制图形,但是我有太多样本,所以X轴被拧紧了。 所以我想要大约每5分钟一次的数据。(或每30分钟) 我当前有的查询是这样的: 这样可以获取最近24小时的样本,但数量太多。 问题答案: 以下内容将为您提供一个示例,该示例包含时间戳记为:00,:05,:10 …的任何数据。 我正在使用取模函

  • 问题内容: 我正在尝试将整数形式的分钟转换为postgres中的间隔 是他们的任何功能将帮助我将其转换为间隔还是我应该将其除以60并获得最终结果 问题答案: 最快的方法是 所以看起来像这样(@Teddy建议) 或者, 并不是说这是最干净的,如果速度不是问题,我更喜欢提到的方法@a_horse_with_no_name

  • 问题内容: 我正在尝试在postgres中的查询中使用group by。我无法按照我想要的方式对其进行工作,以便根据需要对结果进行分组。 这是对我刚刚回答的递归查询的另一个堆栈问题的扩展。但是现在我需要能够将结果分组到最终查询的root_id列上。这是之前的查询: 这是我想做的,以便将具有相同parent_comment_id的所有记录保存在一起。 可能有许多记录返回了相同的parent_comm

  • 我在Athena中有一个表,其中每个记录都有一个时间戳,如。 这方面的SQL语句是什么?我试过使用和,但我不确定我是否正确地使用了它,或者它是否在Presto(雅典娜的SQL查询引擎)中得到支持。 任何帮助都会很好!