MySql 计算包含某个值的行组数量

标签 mysql sql

如何获取状态的“组”数量,其中状态 == 0,不包括启动表的组和跨度 <= 小时的组? (如果时间限制太困难,我们也可以排除计数 <= 40 的组,而不是跨度 <= 小时的组,因为大约每 1:30 分钟记录一行。)

例如,如果按状态 == 0 分组,则以下没有时间限制的示例表将生成 3。

+------+----------+----------+
| id   | status   |time      |
+------+----------+----------+
| 0001 | 1        |11:32:48  |
+------+----------+----------+
| 0002 | 0        |11:30:26  |
+------+----------+----------+
| 0003 | 0        |11:28:54  |
+------+----------+----------+
| 0004 | 1        |11:27:23  |
+------+----------+----------+
| 0005 | 0        |11:25:52  |
+------+----------+----------+
| 0006 | 1        |11:24:20  |
+------+----------+----------+
| 0007 | 1        |11:22:48  |
+------+----------+----------+
| 0008 | 0        |11:21:17  |
+------+----------+----------+
| 0009 | 0        |11:19:45  |
+------+----------+----------+
| 0010 | 0        |11:18:14  |
+------+----------+----------+
| 0011 | 0        |11:16:43  |
+------+----------+----------+
| 0012 | 0        |11:15:11  |
+------+----------+----------+
| 0013 | 0        |11:13:39  |
+------+----------+----------+
| 0002 | 0        |11:12:08  |
+------+----------+----------+
| 0014 | 1        |11:10:37  |
+------+----------+----------+
| 0015 | 1        |11:09:05  |
+------+----------+----------+
| 0016 | 1        |11:07:33  |
+------+----------+----------+
| 0017 | 0        |11:06:02  |
+------+----------+----------+

我能想到的一个解决方案是获取整个表并使用 Java 生成结果,但考虑到该表可能有数百万个条目,我担心这效率太低。

最佳答案

select sum(is_different_from_previous) , status
from (
    select status, 
    (@prevStatus <> status and @prevStatus <> -1) is_different_from_previous,
    @prevStatus := status
    from myTable t1
    cross join (select @prevStatus := -1) t2
    order by t1.time
) t1 group by status

针对特定状态

select * from (
    select sum(is_different_from_previous) , status
    from (
        select status, 
        (@prevStatus <> status and @prevStatus <> -1) is_different_from_previous,
        @prevStatus := status
        from myTable t1
        cross join (select @prevStatus := -1) t2
        order by t1.time
    ) t1 group by status
) t1 where status = 0

编辑

仅计算具有一定数量的 0 的组

select count(*) from (
    select * from (
        select status, 
        (@prevStatus <> status and @prevStatus <> -1) is_different_from_previous,
        if(@prevStatus <> status and @prevStatus <> -1,@groupNumber := @groupNumber + 1, @groupNumber) groupNumber,
        @prevStatus := status
        from myTable t1
        cross join (select @prevStatus := -1, @groupNumber := 0) t2
        order by t1.id
    ) t1
    where status = 0
    group by groupNumber
    having count(*) > 4
) t1

http://sqlfiddle.com/#!9/e4a49/23

关于MySql 计算包含某个值的行组数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25291376/

相关文章:

sql - 如何在关系数据库中维护每个用户最近查看的 N 个项目的列表

php - 破解 INSERT 查询成为 mysql UPDATE 查询

php - 在 Linux 中将 PHP 和 MySQL 安装为服务

MySQL:从 IN 中删除

在计算列上排序时的 MySQL 性能

sql - Postgres 条件选择?

mysql - ORDER BY 如何处理 MySQL 中的单值表达式?

php - 我可以输入,或者将用户输入到没有电子邮件值的 mysql 表中是否安全?

sql - 其中文件名如 '%_123456_%'

mysql - MYSQL 表中的排序规则错误