我有下表:
|3 | 3 |超时| |3 | 3 |超时| |7 | 7 |已确认| |7 | 7 |已确认| |7 | 7 |已确认| |2 | 2 |超时| |2 | 2 |已确认|
对于给定的 s.user_id,我正在尝试计算 计数(已确认)/(计数(已确认)+计数(超时))
所以最终结果应该是这样的: |s.userid |率 |
| 3 | 0 | | 7 | 1 | | 2 | 0.5 |
我看到了一个使用以下查询的解决方案: 选择 s.user_id, avg(if(c.action = 'confirmed', 1, 0)) 作为来自 tablename group by s.user_id;
的费率我知道 avg() 函数接受一个表达式,而 if() 函数根据条件返回值。我不明白这个查询在内部是如何工作的。如果 if() 函数返回一个值,并且 avg() 函数需要一个数字列,那么此查询中操作的逻辑顺序是什么?
使用条件聚合我们可以尝试:
SELECT
user_id,
SUM(action = 'confirmed') / SUM(action IN ('confirmed', 'timeout')) AS ratio
FROM yourTable
ORDER BY user_id;
如果给定用户可能既没有确认也没有超时操作,那么上面的结果将除以零。在这种情况下,假设您希望将比率报告为零,我们可以使用案例逻辑:
SELECT
user_id,
CASE WHEN SUM(action IN ('confirmed', 'timeout')) > 0
THEN SUM(action = 'confirmed') / SUM(action IN ('confirmed', 'timeout'))
ELSE 0
END AS ratio
FROM yourTable
ORDER BY user_id;