问题描述
我试图弄清楚如何创建一个查询,以在一个值更改之前连续提取一个值重复多少次。我的目标是计算“是”列在达到“否”之前重复的次数。我想要最大的重复计数“是”。
例如,如果我有如下表格
+------+-------+-------+
| Id | Name | Blue |
+------+-------+-------+
| 1 | Sam | yes |
| 2 | Mike | yes |
| 3 | Carol | yes |
| 4 | Bob | yes |
| 5 | John | yes |
| 6 | Adam | no |
| 7 | David | yes |
| 8 | Maria | no |
+------+-------+-------+
我想要的是一个查询,该查询会重复拉出“ blue = yes”的所有行。再次尝试计算“ blue = yes”所在行的行数。所以结果应该是这样。
+------+-------+-------+
| Id | Name | Blue |
+------+-------+-------+
| 1 | Sam | yes |
| 2 | Mike | yes |
| 3 | Carol | yes |
| 4 | Bob | yes |
| 5 | John | yes |
+------+-------+-------+
我以为我可以做到
SELECT * where blue = "yes" and id = id + 1
但是不会返回任何数据。我只是无法弄清楚正确拉出查询的逻辑。我做了一些研究,并认为临时表查询可能会起作用,但是不确定如何执行此操作。谢谢您的帮助!
解决方法
可能不是最好的方法,但似乎可行:
SET @count=(SELECT count(*) FROM test);
SET @get_count=(SELECT count(CASE WHEN
@count >= id AND NOT blue="yes" THEN @count:=id END)
FROM test ORDER BY id ASC);
SELECT * FROM test WHERE id < @count ORDER BY id ASC;
设置一个等于记录数的变量。通过id
升序循环浏览记录。 NOT blue="yes"
首次将@count
设置为id
。此后,大小写将始终为false,因为剩余的id将始终大于@count
。然后只需运行查询,选择小于@count
的id。
查询的第一部分从子查询中提取所有信息。
WHERE
子句采用子查询的ID,并确保先前ID和当前ID中的Blue
为“是”。 OR
可以确保不会丢失单个参考点(没有OR
的情况下,您将丢失第一个值)。
http://sqlfiddle.com/#!9/af4674/1
CREATE TABLE TableA (
id INT(12),Name VARCHAR(30),Blue VARCHAR(30)
);
INSERT INTO TableA (id,Name,Blue) VALUES
(1,"Sam","yes"),(2,"Mike",(3,"Carol",(4,"Bob",(5,"John",(6,"Adam","no"),(7,"David",(8,"Maria","no");
SELECT id,Blue
FROM (
SELECT id,Blue
FROM TableA
) t
WHERE (
SELECT Blue
FROM TableA
WHERE id = (select min(id) FROM TableA WHERE id > t.id)
) = "yes"
AND
(
SELECT Blue
FROM TableA
WHERE id = t.id
) = "yes"
OR (
SELECT Blue
FROM TableA
WHERE id = (select max(id) FROM TableA WHERE id < t.id)
) = "yes"
AND (
SELECT Blue
FROM TableA
WHERE id = t.id
) = "yes"