MySQL,组中的最后一个(再次)
我在Stackoverflow中找到了大量关于如何选择组中第一行和最后一行的示例,但我无法根据自己的需要进行调整。唉,我对MySQL有限的知识没有帮助 一些数据(日期和时间、val1和val2)以随机时刻保存。我需要将他们分组15分钟,然后计算每15分钟的间隔:MySQL,组中的最后一个(再次),mysql,group-by,Mysql,Group By,我在Stackoverflow中找到了大量关于如何选择组中第一行和最后一行的示例,但我无法根据自己的需要进行调整。唉,我对MySQL有限的知识没有帮助 一些数据(日期和时间、val1和val2)以随机时刻保存。我需要将他们分组15分钟,然后计算每15分钟的间隔: 间隔中的行数(完成) 1分钟(完成) val1平均值(完成) val1最大值(完成) 组中的第一个val2(完成,易于合并) 组中的最后一个val2(这里我需要你的帮助) 这是我的数据、期望的结果和迄今为止的最大努力 # what
- 间隔中的行数(完成)
- 1分钟(完成)
- val1平均值(完成)
- val1最大值(完成)
- 组中的第一个val2(完成,易于合并)
- 组中的最后一个val2(这里我需要你的帮助)
# what I would like to obtain:
#_timeslice _count _min_val1 _avg_val1 _max_val1 _first_val2 _last_val2
# 2017-11-01T00:00:00Z 4 90 100 110 200 210
# 2017-11-01T00:15:00Z 3 100 110 120 240 230
# 2017-11-01T00:30:00Z 2 110 120 130 270 265
# 2017-11-01T00:45:00Z 4 80 112.5 150 290 320
CREATE TABLE `test-table`
(`date_time` datetime, `val1` float, `val2` float);
INSERT INTO `test-table`
(`date_time`, `val1`, `val2`)
VALUES
('2017-11-01 00:00:00', 100, 200), # first 15 min
('2017-11-01 00:01:00', 110, 190),
('2017-11-01 00:02:05', 90, 220),
('2017-11-01 00:14:00', 100, 210),
('2017-11-01 00:15:00', 100, 240), # second 15 min
('2017-11-01 00:16:00', 110, 250),
('2017-11-01 00:28:00', 120, 230),
('2017-11-01 00:30:00', 110, 270), # third 15 min
('2017-11-01 00:44:59', 130, 265),
('2017-11-01 00:50:00', 120, 290), # fourth 15 min
('2017-11-01 00:55:00', 150, 300),
('2017-11-01 00:57:00', 100, 280),
('2017-11-01 00:58:00', 80, 320)
;
SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(`date_time`)/900)*900) AS _timeslice,
COUNT(*) AS _count,
min(`val1`) as _min_val1,
avg(`val1`) as _avg_val1,
max(`val1`) as _max_val1,
coalesce(`val2`) as _first_val2 # returns the first val2 in the group
# ----> how to add here the last val2 for the group?
FROM `test-table`
GROUP BY _timeslice;
…这是一把同样的小提琴
有人能帮我用一下语法吗 我找到了一个语法简单的解决方案。对于像我这样的新手来说,这可能是最简单的:
SELECT a.*
FROM `test-table` a
JOIN
( SELECT FLOOR(UNIX_TIMESTAMP(date_time)/900) timeslice
, MIN(date_time) min_date_time
, MAX(date_time) max_date_time
FROM `test-table`
GROUP
BY timeslice
) b
ON b.timeslice = FLOOR(UNIX_TIMESTAMP(a.date_time)/900)
AND a.date_time IN(b.min_date_time,b.max_date_time);
+---------------------+------+------+
| date_time | val1 | val2 |
+---------------------+------+------+
| 2017-11-01 00:00:00 | 100 | 200 |
| 2017-11-01 00:14:00 | 100 | 210 |
| 2017-11-01 00:15:00 | 100 | 240 |
| 2017-11-01 00:28:00 | 120 | 230 |
| 2017-11-01 00:30:00 | 110 | 270 |
| 2017-11-01 00:44:59 | 130 | 265 |
| 2017-11-01 00:50:00 | 120 | 290 |
| 2017-11-01 00:58:00 | 80 | 320 |
+---------------------+------+------+
SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(`date_time`)/900)*900) AS _timeslice,
COUNT(*) AS _count,
min(`val1`) as _min_val1,
avg(`val1`) as _avg_val1,
max(`val1`) as _max_val1,
SUBSTRING_INDEX(GROUP_CONCAT(CAST(`val2` AS CHAR) ORDER BY date_time), ',', 1) AS _first_val2,
SUBSTRING_INDEX(GROUP_CONCAT(CAST(`val2` AS CHAR) ORDER BY date_time DESC), ',', 1) AS _last_val2
FROM `test-table`
GROUP BY _timeslice;
拨弄类似这样的东西,GROUP BY在sql模式下无效='only_full_GROUP_BY'表示val2是随机的()。。换句话说,这是纯粹的运气合并(
val2
)返回的第一个值。顺便说一句,在表名中包含“-”是一个非常糟糕的主意。谢谢你们的编辑。我遇到了一些问题,包括代码。关于表名中的“-”,我知道,但它是传统的东西,不能与所有其他特殊字符一起更改,如“ß”、“ü”等。哦,也许这毕竟没关系。我正在尝试我的数据,它工作得又快又完美。还不确定,但我发现这个子字符串+组作为一种解决方法在很多情况下都是可行的。