MySQL,组中的最后一个(再次)

MySQL,组中的最后一个(再次),mysql,group-by,Mysql,Group By,我在Stackoverflow中找到了大量关于如何选择组中第一行和最后一行的示例,但我无法根据自己的需要进行调整。唉,我对MySQL有限的知识没有帮助 一些数据(日期和时间、val1和val2)以随机时刻保存。我需要将他们分组15分钟,然后计算每15分钟的间隔: 间隔中的行数(完成) 1分钟(完成) val1平均值(完成) val1最大值(完成) 组中的第一个val2(完成,易于合并) 组中的最后一个val2(这里我需要你的帮助) 这是我的数据、期望的结果和迄今为止的最大努力 # what

我在Stackoverflow中找到了大量关于如何选择组中第一行和最后一行的示例,但我无法根据自己的需要进行调整。唉,我对MySQL有限的知识没有帮助

一些数据(日期和时间、val1和val2)以随机时刻保存。我需要将他们分组15分钟,然后计算每15分钟的间隔:

  • 间隔中的行数(完成)
  • 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
)返回的第一个值。顺便说一句,在表名中包含“-”是一个非常糟糕的主意。谢谢你们的编辑。我遇到了一些问题,包括代码。关于表名中的“-”,我知道,但它是传统的东西,不能与所有其他特殊字符一起更改,如“ß”、“ü”等。哦,也许这毕竟没关系。我正在尝试我的数据,它工作得又快又完美。还不确定,但我发现这个子字符串+组作为一种解决方法在很多情况下都是可行的。