2016-10-10 69 views
1

表:MySQL選擇自sum> = 3?

+++++++++++++++++++++++++ 
+ id | event | group_id + 
+ 1 | '+1' |  1 + 
+ 2 | 'pt' |  1 + 
+ 3 | 'pt' |  1 + 
+ 4 | '+1' |  1 + 
+ 5 | 'pt' |  1 + 
+ 6 | '+1' |  1 + 
+ 7 | 'pt' |  1 + 
+ 8 | '+1' |  1 + 
+++++++++++++++++++++++++ 

,我需要選擇SUM(CASE WHEN event = '+1' THEN 1 ELSE 0 END)因爲SUM(CASE WHEN event = 'pt' THEN 1 ELSE 0 END) = 3

我嘗試這樣做:

SELECT group_id, SUM(CASE WHEN event = '+1' THEN 1 ELSE 0 END) AS event_sum 
FROM Table 
WHERE SUM(CASE WHEN event = 'pt' THEN 1 ELSE 0 END) >= 3 
ORDER BY id 
GROUP BY group_id 

但這不是組功能的工作方式,所以我怎麼能做到這一點的輸出?當條件SUM(CASE WHEN event = 'pt' THEN 1 ELSE 0 END) = 3爲真時,是否需要使用用戶變量來選擇ID?我相信沒有用戶變量就可以做到這一點,有可能嗎?

所需的輸出:

++++++++++++++++++++++++ 
+ group_id | event_sum + 
+  1 |   2 + 
++++++++++++++++++++++++ 
+0

首先總結其中event = pt標記爲臨時表,然後從temp中選擇並計數,其中event> = 3 –

回答

1

你希望所有的+1活動因爲你至少3 'PT' 事件的時刻數量。

對於'since',我想你想按ID排序事件。

對於pt,您需要一個運行總計。爲了在MySQL中達到這個目的,Stack Overflow有幾個答案(this就是其中之一)。

SET @pts:=0; 
SELECT 
    *, 
    (@pts := @pts + (CASE WHEN event='pt' THEN 1 ELSE 0)) AS pts 
FROM Table 
ORDER BY id; 

但是你要數到在GROUPID的每一個變化中進行設置,這樣:

SET @pts:=0,@gid:=-1; 
SELECT *, 
    (@pts := IF (@gid != groupid, 0, @pts + IF(event='pt', 1, 0))) AS pts, 
    @gid:=groupid 
FROM eventi ORDER BY groupid, id; 

因此,在每個循環,可以保存當前GROUPID值,但在這樣做之前,你檢查它是否一樣。如果不是,那麼你的零點數。

+------+-------+---------+------+---------------+ 
| id | event | groupid | pts | @gid:=groupid | 
+------+-------+---------+------+---------------+ 
| 1 | pt |  1 | 0 |    1 | 
| 2 | pt |  1 | 1 |    1 | 
| 3 | +1 |  1 | 1 |    1 | 
| 4 | pt |  1 | 2 |    1 | 
| 5 | +1 |  1 | 2 |    1 | 
| 6 | +1 |  1 | 2 |    1 | 
| 7 | pt |  2 | 0 |    2 | 
| 8 | pt |  2 | 1 |    2 | 
| 9 | +1 |  2 | 1 |    2 | 
| 10 | pt |  2 | 2 |    2 | 
| 11 | +1 |  2 | 2 |    2 | 
| 12 | +1 |  2 | 2 |    2 | 
+------+-------+---------+------+---------------+ 

從這裏你看到的實際點的數量是關閉的一個(支票以相反的順序進行比增量)。

現在你可以做分組:

SET @pts:=0,@gid:=-1; 
SELECT groupid, SUM(IF(pts >= 3 AND event='+1', 1,0)) AS event_sum FROM (
    SELECT *, 
     (@pts := IF(@gid!=groupid, 0, @pts+IF(event='pt',1,0)))+1 AS pts, 
     @gid:=groupid 
    FROM eventi ORDER BY groupid, id 
) AS a GROUP BY groupid; 


+---------+-----------+ 
| groupid | event_sum | 
+---------+-----------+ 
|  1 |   2 | 
|  2 |   2 | 
+---------+-----------+ 

您可以在同一查詢中合併設置,太:

SELECT ... AS a, (SELECT @pts:=0,@gid:=-1) AS i GROUP BY groupid; 

這是一個test SQLfiddle