簡體   English   中英

計算行數直到MySQL中列的值更改

[英]Count rows until value in column changes in MySQL

我有這個問題一樣的問題計數行直到列中的值更改mysql為止盡管解決了問題,但我不理解此查詢。 因為我的信譽度很低,所以我不能在此處發表評論,而必須提出新的問題。

我的例子:

mysql> select * from example;
+----+-------+------+
| id | name  | succ |
+----+-------+------+
|  1 | peter |    1 |
|  2 | bob   |    1 |
|  3 | peter |    0 |
|  4 | peter |    0 |
|  5 | nick  |    1 |
|  6 | bob   |    0 |
|  7 | peter |    1 |
|  8 | bob   |    0 |
|  9 | peter |    1 |
| 10 | peter |    1 |
+----+-------+------+
10 rows in set (0.00 sec)

我想計算彼得的連續真實值(降序編號,結果必須為3),我知道如何設置查詢:

mysql> select count(succ) 
       from example 
       where id > (select max(id) from example where succ = 0);
+-------------+
| count(succ) |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)

但是如何只為彼得獲得結果,以及是否有可能按名稱對結果進行分組,如下所示:

    +--------+------+
    |name    | succ |
    +--------+------+
    |  peter | 3    |
    |  bob   | 0    |
    |  nick  | 1    |
    +--------+------+

解決此問題的一種方法是使用自我聯接。 使用外部聯接,您可以排除具有匹配行的ID值較高且succ = 0的行,然后使用SUM()CASEsucc = 1的行進行計數。

這是您的示例查詢:

select e1.name, 
  sum(case when e1.succ = 1 then 1 else 0 end) as succ
from example e1 
left outer join example e2 on e2.id > e1.id 
  and e2.name = e1.name 
  and e2.succ = 0
where e2.id is null
group by e1.name

使用變量來計算連續的成功次數(看到失敗時重新啟動),並加入一個查詢,該查詢選擇每個名稱的最高ID(有點類似於McNets的答案)

SELECT a.name, a.count FROM (    
  SELECT  e1.id, e1.name, e1.succ,
    @count_success := IF (@prev_name = e1.name AND e1.succ = 1, @count_success + 1, e1.succ) AS `count`,
    @prev_name := e1.name AS `prev_name`
  FROM `example` e1, (SELECT @count_success :=0, @prev_name := NULL) init
  ORDER BY e1.name, e1.id ) `a` 
  JOIN (SELECT MAX(id) AS `max` FROM `example` GROUP BY `name`) `b` ON a.id = b.max

如果您需要記錄數量

select name, count(succ) from example group by name

或者如果您需要每個人的成功總和,則可以使用

select name, sum(succ) from example group by name 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM