如何获取状态的“组”数量,其中状态 == 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
关于MySql 计算包含某个值的行组数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25291376/