【问题标题】:Repeated and grouped values in MysqlMysql中的重复值和分组值
【发布时间】:2017-05-19 09:17:50
【问题描述】:

如何计算值 0 仅在表中重复 3 次或更多次(常量在下一行中重复)时在表中重复的次数

在这种情况下,值 0 重复超过 3 次将是 2 次。

+-----------+-------+---------------------+
| idDataGps | speed | eventDate           |
+-----------+-------+---------------------+
|    143483 |    56 | 2017-05-18 08:42:05 |
|    143484 |     0 | 2017-05-18 08:42:11 |
|    143485 |     0 | 2017-05-18 08:42:20 |
|    143486 |     0 | 2017-05-18 08:42:35 |
|    143487 |    43 | 2017-05-18 08:42:40 |
|    143488 |    44 | 2017-05-18 08:42:50 |
|    143489 |    48 | 2017-05-18 08:43:05 |
|    143490 |    24 | 2017-05-18 08:43:14 |
|    143491 |    34 | 2017-05-18 08:43:16 |
|    143492 |     9 | 2017-05-18 08:43:20 |
|    143493 |    14 | 2017-05-18 08:43:36 |
|    143494 |     0 | 2017-05-18 08:44:06 |
|    143495 |     0 | 2017-05-18 08:44:21 |
|    143496 |     0 | 2017-05-18 08:46:06 |
|    143497 |     0 | 2017-05-18 08:48:36 |
|    143498 |     0 | 2017-05-18 08:48:42 |
+-----------+-------+---------------------+

【问题讨论】:

  • MySQL 行未排序。您是否有另一列提供订单,例如日期时间或 ID?
  • 是的对不起,我有连续的 id 和日期时间时间戳,用实际的数据库查询编辑我的问题

标签: mysql count


【解决方案1】:

使用用户定义的变量来保持从一行到下一行的状态。使用一个变量@zerocount 计数连续的零速;每当speed != 0 时它会重置回0,并在speed = 0 时递增。每当遇到非零值时,另一个变量 @counter 就会递增,因此所有连续的零都将在同一个 @counter 组中。

然后要找出零的运行时间,我们使用MAX(zerocount)counter 分组。

SELECT COUNT(*) FROM (
    SELECT counter, MAX(zerocount) AS maxcount
    FROM (
        SELECT speed, IF(speed = 0, @zerocount := @zerocount+1, @zerocount := 0) as zerocount,
            IF(speed != 0, @counter := @counter + 1, @counter) AS counter
        FROM (SELECT speed FROM yourTable ORDER BY eventDate) AS t
        CROSS JOIN (SELECT @counter := 0, @zerocount := 0) AS var
    ) AS x
    GROUP BY counter
) AS y
WHERE maxcount >= 3

DEMO

【讨论】:

  • 太棒了!变量的好方法,我被困在这个上
  • 现在,如果我想知道在 speed = 0 上花费的总时间,我可以在同一个查询上进行,还是应该用类似的逻辑创建一个新的?这 2 次在 0 速度上花费了多少时间?
  • 您可以使用另一个变量将eventDate 之间的时间差相加在 0 的连续行上。
猜你喜欢
  • 2011-08-29
  • 2021-03-27
  • 1970-01-01
  • 2015-07-22
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2022-01-08
相关资源
最近更新 更多