【问题标题】:Group by a variable range in mysql / MariaDB在 mysql / MariaDB 中按变量范围分组
【发布时间】:2015-09-15 11:46:36
【问题描述】:

我有一个历史记录,我想总结一些条目。间隔应为 5 秒

例如: 我有一个清单

date_start          | date_end           | count | somestring
2015-09-15 12:04:09 | 2015-09-15 12:04:09| 1     | xyz
2015-09-15 12:05:09 | 2015-09-15 12:05:09| 1     | xyz
2015-09-15 12:05:10 | 2015-09-15 12:05:10| 1     | xyz
2015-09-15 12:05:11 | 2015-09-15 12:05:11| 1     | xyz
2015-09-15 12:06:09 | 2015-09-15 12:06:09| 1     | xyz

我现在想要一个类似的输出

date_start          | date_end           | count | somestring
2015-09-15 12:04:09 | 2015-09-15 12:04:09| 1     | xyz
2015-09-15 12:05:09 | 2015-09-15 12:05:11| 3     | xyz <--
2015-09-15 12:06:09 | 2015-09-15 12:06:09| 1     | xyz

因此,如果在 5 秒间隔内有重复项,我想将其分组到一个条目中。但是如果每个最大值在 1 小时内有多个条目。相隔 5 秒,我也想计算所有这些条目。

有人知道方法吗?我已经在这工作了好几个星期了:(

编辑: Bernd的回答和评论: 非常感谢,您的查询的输出是: 谢谢@Bernd。问题是,您的查询的输出是:

+---------+---------------------+--------------+---------------------+----+---------------------+---------------------+-----------+------+
| mycount | st                  | group_number | tmp_interv          | id | start_date          | end_date            | some_text | cnt  |
+---------+---------------------+--------------+---------------------+----+---------------------+---------------------+-----------+------+
|       2 | 2015-09-14 12:00:05 | 0            | 2015-09-14 12:00:05 |  1 | 2015-09-14 12:00:00 | 2015-09-14 12:00:00 | some      |    1 |
|       4 | 2015-09-14 12:00:05 | 1            | 2015-09-14 12:01:08 |  3 | 2015-09-14 12:01:03 | 2015-09-14 12:01:03 | some      |    1 |
|       1 | 2015-09-14 12:01:08 | 2            | 2015-09-14 12:01:14 |  7 | 2015-09-14 12:01:09 | 2015-09-14 12:01:09 | some      |    1 |
+---------+---------------------+--------------+---------------------+----+---------------------+---------------------+-----------+------+

但它应该是这样的:

+---------+---------------------+--------------+---------------------+----+---------------------+---------------------+-----------+------+
| mycount | st                  | group_number | tmp_interv          | id | start_date          | end_date            | some_text | cnt  |
+---------+---------------------+--------------+---------------------+----+---------------------+---------------------+-----------+------+
|       2 | 2015-09-14 12:00:05 | 0            | 2015-09-14 12:00:05 |  1 | 2015-09-14 12:00:00 | 2015-09-14 12:00:03 | some      |    1 |
|       5 | 2015-09-14 12:00:05 | 1            | 2015-09-14 12:01:08 |  3 | 2015-09-14 12:01:03 | 2015-09-14 12:01:09 | some      |    1 |
+---------+---------------------+--------------+---------------------+----+--------------------+----------------------+-----------+------+

注意 count 和 date_end :)

【问题讨论】:

  • 是第一次的时间间隔,即 2015-09-15 12:05:09 或总是从最后一个 gouped 条目开始。所以如果你每秒有一行,它是分组一行还是多行
  • @BerndBuffen 如果条目在 5 秒的间隔内,则应将它们分组,因此结束时间可能比开始时间晚一个小时,如果它们之间最多有 5 秒的条目

标签: mysql group-by mariadb intervals


【解决方案1】:

这是我的第一次尝试:

CREATE TABLE `dtable` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `start_date` timestamp NULL DEFAULT NULL,
  `end_date` timestamp NULL DEFAULT NULL,
  `some_text` varchar(32) DEFAULT NULL,
  `cnt` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

INSERT INTO `dtable` (`id`, `start_date`, `end_date`, `some_text`, `cnt`)
VALUES
    (1, '2015-09-14 12:00:00', '2015-09-14 12:00:00', 'some', 1),
    (2, '2015-09-14 12:00:03', '2015-09-14 12:00:03', 'some', 1),
    (3, '2015-09-14 12:01:03', '2015-09-14 12:01:03', 'some', 1),
    (4, '2015-09-14 12:01:04', '2015-09-14 12:01:03', 'some', 1),
    (5, '2015-09-14 12:01:05', '2015-09-14 12:01:03', 'some', 1),
    (6, '2015-09-14 12:01:08', '2015-09-14 12:01:08', 'some', 1),
    (7, '2015-09-14 12:01:09', '2015-09-14 12:01:09', 'some', 1);


SELECT sum(cnt) mycount, t.* FROM (
  SELECT
    @interval_end:=IF(@interval_end = 0, d.start_date + INTERVAL 5 SECOND, @interval_end ) st,
    @group_nr:= IF( d.start_date > @interval_end, @group_nr:=@group_nr+1, @group_nr ) group_number,
    @interval_end:= IF( d.start_date > @interval_end, d.start_date + INTERVAL 5 SECOND , @interval_end ) tmp_interv,
    d.* FROM dtable d,(SELECT @group_nr:=0, @interval_end:=0) tmp
) AS t
GROUP BY t.group_number;  

请检查并说出什么问题

【讨论】:

  • 感谢您的帮助@Bernd。我在我的问题中添加了一条评论 :) 希望这能让我的问题更清楚
【解决方案2】:

我找到了解决方案,比你多 Bernd,我修改了你的查询以达到我的目的:

选择

sum(cnt) mycount, t.start_date, max(t.start_date) date_end, t.* FROM (
  SELECT
    @interval_end:=IF(@interval_end = 0, d.start_date + INTERVAL 5 SECOND, @interval_end ) st,
    @group_nr:= IF( d.start_date > @interval_end, @group_nr:=@group_nr+1, @group_nr ) group_number,
    @interval_end:= IF( d.start_date > @interval_end, d.start_date + INTERVAL 5 SECOND , d.start_date + INTERVAL 5 SECOND) tmp_interv,
    d.* FROM dtable d,(SELECT @group_nr:=0, @interval_end:=0) tmp
) AS t
GROUP BY t.group_number;  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2010-10-31
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多