sql 分组查询time时间间隔大于30分钟的两行,列出2条记录,并列出每组首尾记录,求大神解决!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 分组查询time时间间隔大于30分钟的两行,列出2条记录,并列出每组首尾记录,求大神解决!相关的知识,希望对你有一定的参考价值。
输出为右表所示
参考技术A这是不相关的软件!!
如何将时间列分别分组为 5 分钟间隔和最大值/最小值 SQL?
【中文标题】如何将时间列分别分组为 5 分钟间隔和最大值/最小值 SQL?【英文标题】:How to group time column into 5 minute intervals and max/min value respectively SQL? 【发布时间】:2016-08-31 05:33:36 【问题描述】:我有一个数据库,其中 Datetime 列包含 +/- 30 秒的间隔,Value 列包含 10 到 100 之间的随机数。我的表如下所示:
datetime value
----------------------------
2016-05-04 20:47:20 12
2016-05-04 20:47:40 44
2016-05-04 20:48:30 56
2016-05-04 20:48:40 25
2016-05-04 20:49:30 92
2016-05-04 20:49:40 61
2016-05-04 20:50:00 79
2016-05-04 20:51:20 76
2016-05-04 20:51:30 10
2016-05-04 20:51:40 47
2016-05-04 20:52:40 23
2016-05-04 20:54:00 40
2016-05-04 20:54:10 18
2016-05-04 20:54:50 12
2016-05-04 20:56:00 55
我想要以下输出:
datetime max_val min_val
-----------------------------------------
2016-05-04 20:45:00 92 12
2016-05-04 20:50:00 79 10
2016-05-04 20:55:00 55 55
在我能够继续获取最大值和最小值之前,我首先必须将 datetime 列GROUP 分成 5 分钟的间隔。根据我的研究,我想出了这个:
SELECT
time,
value
FROM random_number_minute
GROUP BY
UNIX_TIMESTAMP(time) DIV 300
实际上 GROUPS 将 datetime 列分成 5 分钟的间隔,如下所示:
datetime
-------------------
2016-05-04 20:47:20
2016-05-04 20:50:00
2016-05-04 20:56:00
这非常接近,因为它需要下一个最接近的日期时间,在这种情况下,20:45:00
、20:50:00
等。我想四舍五入 datetime 到最接近的 5 分钟,而不管 秒,例如,如果分钟是:
minutes rounddown
--------------------
10 10
11 10
12 10
13 10
14 10
15 15
16 15
17 15
18 15
19 15
20 20
时间可能是14:59,我想四舍五入到10:00。经过数小时的研究,我也尝试使用它:
SELECT
time,
time_rounded =
dateadd(mi,(datepart(mi,dateadd(mi,1,time))/5)*5,dateadd(hh,datediff(hh,0,dateadd(mi,1,time)),0))
但遗憾的是,这并没有奏效。我收到此错误:
调用本机函数“datediff”时参数计数不正确
我也试过这个:
SELECT
time, CASE
WHEN DATEDIFF(second, DATEADD(second, DATEDIFF(second, 0, time_out) / 300 * 300, 0), time) >= 240
THEN DATEADD(second, (DATEDIFF(second, 0, time) / 300 * 300) + 300, 0)
ELSE DATEADD(second, DATEDIFF(second, 0, time) / 300 * 300, 0)
END
返回相同的错误。
我该怎么做?而datetime分组后,如何获取数据分组的最大值和最小值?
【问题讨论】:
我正在使用 MySQL。对不起这个错误。准确地说,MyWebSQL 是 Wordpress 的一个插件 【参考方案1】:在 GROUP BY 中使用各种日期分区函数。
代码:
SELECT from_unixtime(300 * round(unix_timestamp(r.datetime)/300)) AS 5datetime,
MAX(r.value) AS max_value,
MIN(r.value) As min_value,
(SELECT r.value FROM random_number_minute ra WHERE ra.datetime = r.datetime order by ra.datetime desc LIMIT 1) as first_val
FROM random_number_minute r
GROUP BY UNIX_TIMESTAMP(r.datetime) DIV 300
输出:
5datetime max_value min_value first_val
May, 04 2016 20:45:00 92 12 12
May, 04 2016 20:50:00 79 10 79
May, 04 2016 20:55:00 55 55 55
SQL 小提琴:http://sqlfiddle.com/#!9/e16b1/17/0
【讨论】:
与我的方法相同。简单地舍入时间而不是使用DIV
。我现在试试@Matt 谢谢你的回答
第一个 val 更新,最后一个 val 需要考虑【参考方案2】:
对不起,如果我重复另一个答案。有的话我就删了..
SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(datetime)/300)*300) x
, MIN(value) min_value
, MAX(value) max_value
FROM my_table
GROUP
BY x;
【讨论】:
我喜欢你的方法@Strawberry 谢谢!【参考方案3】:SELECT
timestamp(concat(date(time), ' ', hour(time), ':', minute(time) div 5 * 5)) as floor_time,
min(value),
max(value)
FROM random_number_minute
GROUP BY date(time), hour(time), minute(time) div 5 * 5
http://sqlfiddle.com/#!9/91212f/5
【讨论】:
以上是关于sql 分组查询time时间间隔大于30分钟的两行,列出2条记录,并列出每组首尾记录,求大神解决!的主要内容,如果未能解决你的问题,请参考以下文章
如何将时间列分别分组为 5 分钟间隔和最大值/最小值 SQL?
使用 T-SQL 将 OHLC-Stockmarket 数据分组到多个时间范围内
Python - 按时间间隔分组的时间加权平均 Pandas