首页 \ 问答 \ 选择按HOUR()分组的时间序列(Select time series grouped by HOUR() with wrap around)

选择按HOUR()分组的时间序列(Select time series grouped by HOUR() with wrap around)

我有一张温度读数表,需要得到过去24小时内每小时的平均温度,但是“缠绕”当前小时。

我用这句话:

SELECT DISTINCT HOUR(readAt) pointTime
              , ROUND(AVG(temperature),1) avgTemp 
           FROM TempReadings 
          WHERE readAt BETWEEN DATE(NOW() - INTERVAL 1 DAY) AND NOW()) 
            AND temperature IS NOT NULL 
          GROUP 
             BY pointTime;

readAt是一个时间戳。 我希望有序结果在当前时间周围“换行”,所以如果我在上午10点1分查询第一行应该是前一天上午9点,最后一行是今天上午10点。

从上面的查询我得到这个:

+-----------+---------+
| pointTime | avgTemp |
+-----------+---------+
|         5 |    23.2 |
|         6 |    12.9 |
|         7 |    11.6 |
|         8 |    14.3 |
|         9 |    10.4 |
|        10 |    12.5 |
|        17 |     0.0 |
|        18 |    23.3 |
|        19 |    14.4 |
|        20 |    14.6 |
|        21 |    17.1 |
+-----------+---------+

11 rows in set (0.00 sec)                 ------------------ formatted as codes

编辑22.10:我使用以下测试语句:

CREATE TABLE TempReadings (
readAt DATETIME NOT NULL,
temperature FLOAT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=big5;

INSERT INTO TempReadings VALUES ((NOW() - INTERVAL 13 HOUR), 10);
INSERT INTO TempReadings VALUES ((NOW()), 20);
INSERT INTO TempReadings VALUES ((NOW() - INTERVAL 2 HOUR), 30);
INSERT INTO TempReadings VALUES ((NOW() - INTERVAL 14 HOUR), 40);
INSERT INTO TempReadings VALUES ((NOW() - INTERVAL 16 HOUR), 50);

SELECT * FROM TempReadings;
+---------------------+-------------+
| readAt              | temperature |
+---------------------+-------------+
| 2016-10-21 20:15:38 |          10 |
| 2016-10-22 09:15:38 |          20 |
| 2016-10-22 07:15:38 |          30 |
| 2016-10-21 19:15:38 |          40 |
| 2016-10-21 17:15:38 |          50 |
+---------------------+-------------+e

下面的语句产生按小时排序的平均值,但我希望最早的平均值是第一行

SELECT DISTINCT(HOUR(readAt)) as pointTime, ROUND(AVG(temperature), 1) AS avgTemp FROM TempReadings WHERE (readAt BETWEEN DATE(NOW() - INTERVAL 1 DAY) AND NOW()) AND temperature IS NOT NULL GROUP BY pointTime;

+-----------+---------+
| pointTime | avgTemp |
+-----------+---------+
|         7 |    30.0 |
|         9 |    20.0 |
|        17 |    50.0 |
|        19 |    40.0 |
|        20 |    10.0 |
+-----------+---------+

所以我希望订单是(pointTime):17(第一行),19,20,7,9(最后一个)


I have a table with temperature readings and need to get the average temp for each hour the last 24 hours but "wrapped around" current hour.

I use this statement:

SELECT DISTINCT HOUR(readAt) pointTime
              , ROUND(AVG(temperature),1) avgTemp 
           FROM TempReadings 
          WHERE readAt BETWEEN DATE(NOW() - INTERVAL 1 DAY) AND NOW()) 
            AND temperature IS NOT NULL 
          GROUP 
             BY pointTime;

readAt is a timestamp. I would like the ordered result to "wrap" around current hour, so if I query at 10.01am first row should be 9am the previous day and last row 10am today.

From the above query I get this:

+-----------+---------+
| pointTime | avgTemp |
+-----------+---------+
|         5 |    23.2 |
|         6 |    12.9 |
|         7 |    11.6 |
|         8 |    14.3 |
|         9 |    10.4 |
|        10 |    12.5 |
|        17 |     0.0 |
|        18 |    23.3 |
|        19 |    14.4 |
|        20 |    14.6 |
|        21 |    17.1 |
+-----------+---------+

11 rows in set (0.00 sec)                 ------------------ formatted as codes

Edit 22.10: I use the following test statements:

CREATE TABLE TempReadings (
readAt DATETIME NOT NULL,
temperature FLOAT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=big5;

INSERT INTO TempReadings VALUES ((NOW() - INTERVAL 13 HOUR), 10);
INSERT INTO TempReadings VALUES ((NOW()), 20);
INSERT INTO TempReadings VALUES ((NOW() - INTERVAL 2 HOUR), 30);
INSERT INTO TempReadings VALUES ((NOW() - INTERVAL 14 HOUR), 40);
INSERT INTO TempReadings VALUES ((NOW() - INTERVAL 16 HOUR), 50);

SELECT * FROM TempReadings;
+---------------------+-------------+
| readAt              | temperature |
+---------------------+-------------+
| 2016-10-21 20:15:38 |          10 |
| 2016-10-22 09:15:38 |          20 |
| 2016-10-22 07:15:38 |          30 |
| 2016-10-21 19:15:38 |          40 |
| 2016-10-21 17:15:38 |          50 |
+---------------------+-------------+e

Below statement produces the average sorted by hour but I would like the oldest average to be the first row

SELECT DISTINCT(HOUR(readAt)) as pointTime, ROUND(AVG(temperature), 1) AS avgTemp FROM TempReadings WHERE (readAt BETWEEN DATE(NOW() - INTERVAL 1 DAY) AND NOW()) AND temperature IS NOT NULL GROUP BY pointTime;

+-----------+---------+
| pointTime | avgTemp |
+-----------+---------+
|         7 |    30.0 |
|         9 |    20.0 |
|        17 |    50.0 |
|        19 |    40.0 |
|        20 |    10.0 |
+-----------+---------+

So I would like the order to be (pointTime): 17 (first row), 19, 20, 7, 9 (last)


原文:https://stackoverflow.com/questions/40172077
更新时间:2022-10-20 08:10

相关文章

更多

最新问答

更多
  • python的访问器方法有哪些
  • 使用Zend Framework 2中的JOIN sql检索数据(Retrieve data using JOIN sql in Zend Framework 2)
  • 透明度错误IE11(Transparency bug IE11)
  • linux的基本操作命令。。。
  • 响应navi重叠h1和nav上的h1链接不起作用(Responsive navi overlaps h1 and navi links on h1 isn't working)
  • 在C中读取文件:“r”和“a +”标志的不同行为(Reading a File in C: different behavior for “r” and “a+” flags)
  • NFC提供什么样的带宽?(What Kind of Bandwidth does NFC Provide?)
  • 元素上的盒子阴影行为(box-shadow behaviour on elements)
  • Laravel检查是否存在记录(Laravel Checking If a Record Exists)
  • 设置base64图像的大小javascript - angularjs(set size of a base64 image javascript - angularjs)
  • 想学Linux 运维 深圳有哪个培训机构好一点
  • 为什么有时不需要在lambda中捕获一个常量变量?(Why is a const variable sometimes not required to be captured in a lambda?)
  • 在Framework 3.5中使用服务器标签<%=%>设置Visible属性(Set Visible property with server tag <%= %> in Framework 3.5)
  • AdoNetAppender中的log4net连接类型无效(log4net connection type invalid in AdoNetAppender)
  • 错误:发送后无法设置标题。(Error: Can't set headers after they are sent. authentication system)
  • 等待EC2实例重启(Wait for an EC2 instance to reboot)
  • 如何在红宝石中使用正则表达式?(How to do this in regex in ruby?)
  • 使用鼠标在OpenGL GLUT中绘制多边形(Draw a polygon in OpenGL GLUT with mouse)
  • 江民杀毒软件的KSysnon.sys模块是什么东西?
  • 处理器在传递到add_xpath()或add_value()时调用了什么顺序?(What order are processors called when passed into add_xpath() or add_value()?)
  • sp_updatestats是否导致SQL Server 2005中无法访问表?(Does sp_updatestats cause tables to be inaccessible in SQL Server 2005?)
  • 如何创建一个可以与持续运行的服务交互的CLI,类似于MySQL的shell?(How to create a CLI that can interact with a continuously running service, similar to MySQL's shell?)
  • AESGCM解密失败的MAC(AESGCM decryption failing with MAC)
  • SQL查询,其中字段不包含$ x(SQL Query Where Field DOES NOT Contain $x)
  • PerSession与PerCall(PerSession vs. PerCall)
  • C#:有两个构造函数的对象:如何限制哪些属性设置在一起?(C#: Object having two constructors: how to limit which properties are set together?)
  • 平衡一个精灵(Balancing a sprite)
  • n2cms Asp.net在“文件”菜单上给出错误(文件管理器)(n2cms Asp.net give error on Files menu (File Manager))
  • Zurb Foundation 4 - 嵌套网格对齐问题(Zurb Foundation 4 - Nested grid alignment issues)
  • 湖北京山哪里有修平板计算机的