【问题标题】:SQL all rows with a minimum interval betweenSQL 所有行之间的最小间隔
【发布时间】:2017-03-04 03:10:35
【问题描述】:

我有一个只有两个字段的表(在 SQLite3 中,但我可以使用 PostgreSQL 或 SQLServer),它们有一个 datetime 和一个 int 值(房间的温度),如下所示:

+-----------------------------------+
| Table: Temperature                |
+---------------------+-------------+
| Date                | Temperature |
+---------------------+-------------+
| 2017-03-03 15:10:00 |          25 |
| 2017-03-03 15:11:00 |          25 |
| 2017-03-03 15:12:00 |          25 |
| 2017-03-03 15:13:00 |          25 |
| 2017-03-03 15:14:00 |          26 |
| 2017-03-03 15:15:00 |          26 |
| 2017-03-03 15:16:00 |          26 |
| 2017-03-03 15:17:00 |          26 |
| 2017-03-03 15:18:00 |          26 |
| 2017-03-03 15:19:00 |          27 |
| 2017-03-03 15:20:00 |          27 |
+---------------------+-------------+

就像在示例中一样,我每分钟都有一个温度。

这用于监控其他系统的温度,但我也喜欢在网页中显示它,使用 python (flask),但在网页中显示每分钟的温度并不重要,但在每 10 分钟或每小时更好。

如何选择仅显示每 10 分钟(或其他间隔)的温度?所以我的结果一定是:

+-----------------------------------+
| Table: Temperature                |
+---------------------+-------------+
| Date                | Temperature |
+---------------------+-------------+
| 2017-03-03 15:10:00 |          25 |
| 2017-03-03 15:20:00 |          27 |
+---------------------+-------------+

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    对于 sql-server,你可以这样做:

    select * 
    from temperature 
    where datepart(minute,[date])%10 = 0
    

    对于 postgres,你可以使用这样的东西:

    select *
    from temperature 
    where cast(date_part('minute',date) as int) % 10 = 0;
    

    都返回:

    +---------------------+-------------+
    |        date         | temperature |
    +---------------------+-------------+
    | 2017-03-03 15:10:00 |          25 |
    | 2017-03-03 15:20:00 |          27 |
    +---------------------+-------------+
    

    sql server rextester 演示:http://rextester.com/DXMCK81428

    postgres rextester 演示:http://rextester.com/NAXX57760

    【讨论】:

    • 根据你的回答,我为 SQLite3 做了这个:SELECT * FROM temperature WHERE CAST(strftime('%M', datetime(date)) as int) % 10 = 0
    • @RobertoCorreia 不错!对 sql-lite 的良好翻译
    【解决方案2】:
    SELECT * FROM table LIMIT -1 OFFSET 10
    

    来自post

    【讨论】:

    • 我喜欢这个,因为它很短。但是,虽然我说每一行都是每分钟插入一次,但也许串口会出现一些错误,2分钟或更长时间才会插入下一行,然后,接下来的所有行都会出错。
    【解决方案3】:
    select * from temperature where substr(date,16,1)='0' order by date
    

    一个改进可能是返回每十分钟的平均温度。这也将使它更健壮地防止丢失测量:

    select
      'From '||min(date)||' to '||max(date)  period,
      sum(1)                                 meassurements,
      avg(temp)                              avg_temp
    from temperature
    group by substr(date,1,15)
    order by 1
    

    将 15 替换为 14 以显示小时周期。

    下一步还可以显示完全错过测量的时段。这也可以只用一个查询来完成。我没有在这里展示。

    【讨论】:

      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多