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