【发布时间】:2016-01-09 11:14:00
【问题描述】:
我知道如何计算具有特定值的行数,但是如何计算行数直到该值发生变化?
例如:
1 cat
2 cat
3 cat
4 dog
5 dog
6 cat
7 cat
如果不计算最后两只猫,我如何计算前三只猫?
【问题讨论】:
我知道如何计算具有特定值的行数,但是如何计算行数直到该值发生变化?
例如:
1 cat
2 cat
3 cat
4 dog
5 dog
6 cat
7 cat
如果不计算最后两只猫,我如何计算前三只猫?
【问题讨论】:
您可以找到第一个不是猫的事物的 id 并计算小于该值的 id:
select count(*)
from t
where id < (select min(t2.id) from t t2 where t2.value <> 'cat');
【讨论】:
你可以这样做:
SELECT @val := 1;
SELECT COUNT(IF(@val = 1 AND animal = 'cat', @val := 1, @val := NULL)) cnt FROM animals;
这是做什么的:
这将为您提供所需的计数。如果您需要行的实际值,可以执行以下操作:
SELECT @val := 1;
SELECT * FROM (
SELECT id, animal, IF(@val = 1 AND animal = 'cat', @val := 1, @val := NULL) ok FROM animals
) _animals WHERE ok = 1;
if 语句的作用是,只要 @val = 1(初始条件)并且您正在看一只猫,将 @val 设置为 1 并返回 1。一旦动物不再是猫, @val 变为 NULL,这意味着所有未来的行也将返回 NULL(因为 @val 将不再为 1)。
【讨论】: