数据库查询,怎样按一定时间间隔跳跃查询数据?

发布于 2022-08-29 19:13:16 字数 763 浏览 9 评论 0

我的项目用的是MySQL,但也想同时请教下在Oracle、SqlServer中应该如何处理如下问题:

有数据表如下所示:
希望从表中抽取数据,要求两条记录的时间间隔至少2分钟
对下面图片中的数据而言,假如我查询的时间范围是从2014-08-10 23:20:00开始的,
则希望抽取到如下结果集:

'83', '57', '10041', '74.27', '0', '2014-08-10 23:20:04'
'113', '57', '10041', '59.25', '0', '2014-08-10 23:22:06'
'145', '57', '10041', '96.21', '0', '2014-08-10 23:24:07'
'177', '57', '10041', '34.16', '0', '2014-08-10 23:26:08'
'209', '57', '10041', '39.11', '0', '2014-08-10 23:28:09'

真实的场景是:传感器每隔30秒左右会向数据库里写一条记录,我要取N天的数据绘图,如果一次性查询N天的记录再进行抽稀的话,由于结果集太大,循环次数过多,导致时耗严重。我希望能通过sql语句直接在数据库层面进行数据抽稀,程序里要处理的数据就会少很多。

问题就是,应该如何写SQL语句?谢谢各位!

数据表示例

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

梦旅人picnic 2022-09-05 19:13:16

@Chobits 的答案啦,本来想在他下面评论的,想想还是写出来,题主能看到。

  select * from (select rank() over(order by HTAH01A060) as rank_sort,* from table)
    as a where a.rank_sort%4 = 0

如果不能保证HTAH01A060都不同的话,建议用row_number()

吃兔兔 2022-09-05 19:13:16

各位好,昨天晚上自己找到了一个方法,基本能满足我的需求。欢迎各位继续讨论~~看看有没有更好的方法~~

/*存储过程:按起始、终止时间,以及时间间隔,抽取数据*/
DELIMITER $
DROP PROCEDURE IF EXISTS proc_HTAH01A_sampleData $
CREATE DEFINER=`root`@`localhost` PROCEDURE proc_HTAH01A_sampleData(IN timeBegin DATETIME, IN timeEnd DATETIME, IN timeInterval INT)
    BEGIN
        SET @time := '1000-01-01 00:00:00';
        SET @interval := timeInterval;
        SELECT * FROM HTAH01A
        WHERE HTAH01A060 >= timeBegin AND HTAH01A060 <= timeEnd
        AND TIMESTAMPDIFF( SECOND, @time, HTAH01A060 ) >= @interval
        AND @time := htah01a060;
    END$
DELIMITER ;

调用如下:

call proc_HTAH01A_sampleData('2014-08-10 23:20:00', '2014-08-11 05:00:00', 120);
暮年 2022-09-05 19:13:16

查rank排名 取rank除4余数相同的即可

旧城烟雨 2022-09-05 19:13:16

楼主变通一下思路,反正是绘图,不必一定按照时间间隔查数据;

-- MySQL的做法:
select @rank:=0;
select * from(select *,@rank:=@rank+1 as rank from 你的表名) as dd where dd.rank%间隔参数=0;

高跟鞋的旋律 2022-09-05 19:13:16
SELECT *
FROM `tablename`
WHERE mod( unix_timestamp( `time` ) - unix_timestamp( '2014-08-01 23:59:50' ) , 24 *60 *60 )
BETWEEN 0
AND 20
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文