MySQL选择自和>;=3.
表: 我需要选择MySQL选择自和>;=3.,mysql,Mysql,表: 我需要选择SUM(CASE WHEN event='+1'然后1 ELSE 0 END)因为SUM(CASE WHEN event='pt'然后1 ELSE 0 END)=3 我试过这个: +++++++++++++++++++++++++ + id | event | group_id + + 1 | '+1' | 1 + + 2 | 'pt' | 1 + + 3 | 'pt' | 1 + + 4 | '+1' |
SUM(CASE WHEN event='+1'然后1 ELSE 0 END)
因为SUM(CASE WHEN event='pt'然后1 ELSE 0 END)=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(事件='pt'然后1 ELSE 0 END)=3
为真时,是否需要使用用户变量来选择id?我相信这是可能的,没有用户变量,这是可能的吗
期望输出:
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
您需要所有+1事件的数量,因为您至少获得3个“pt”事件 对于'since',我猜您希望按ID排序事件 对于pt,您需要一个运行总数。为了在MySQL中实现这一点,有几个关于堆栈溢出的答案(只有一个) 但您希望在每次更改groupid时重置计数,因此:
SET @pts:=0;
SELECT
*,
(@pts := @pts + (CASE WHEN event='pt' THEN 1 ELSE 0)) AS pts
FROM Table
ORDER BY id;
因此,在每个循环中保存当前的groupid值,但在执行此操作之前,请检查它是否相同。如果不是,那么您可以将pts计数设为零
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;
从这里可以看到,实际pts’的数量减少了1(检查的顺序与增量相反)
现在您可以进行分组:
+------+-------+---------+------+---------------+
| 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 |
+---------+-----------+
这是一个。首先求和,其中event=pt标记为temp表,然后从temp中选择并计数,其中event>=3
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;