一列的MySQL计数唯一,其中另一列在Group By中具有单个值
请看下表。我想计算不同的访客id,按组id分组,但只计算结果总是“拒绝”该访客的访客id 差不多一列的MySQL计数唯一,其中另一列在Group By中具有单个值,mysql,sql,select,group-by,Mysql,Sql,Select,Group By,请看下表。我想计算不同的访客id,按组id分组,但只计算结果总是“拒绝”该访客的访客id 差不多 SELECT group_id, COUNT(DISTINCT visitor_id) AS always_declines FROM customer_actions WHERE outcome='declined' [[AND HAS NEVER BEEN IN ('purchased')]] GROUP BY group_id; 以下是我的表格的简化版本: SELECT * FROM cu
SELECT group_id, COUNT(DISTINCT visitor_id) AS always_declines
FROM customer_actions
WHERE outcome='declined' [[AND HAS NEVER BEEN IN ('purchased')]]
GROUP BY group_id;
以下是我的表格的简化版本:
SELECT * FROM customer_actions;
+----+------------+-----------+----------+
| id | visitor_id | outcome | group_id |
+----+------------+-----------+----------+
| 1 | 5 | purchased | 1 |
| 2 | 5 | purchased | 1 |
| 3 | 6 | purchased | 1 |
| 4 | 7 | declined | 1 |
| 5 | 6 | declined | 1 |
| 6 | 7 | purchased | 1 |
| 7 | 8 | declined | 1 |
| 8 | 8 | declined | 1 |
+----+------------+-----------+----------+
8 rows in set (0.00 sec)
因此,基本上,如果它起作用,那么我将查找本例中返回的第一行也是唯一一行:
组id=1
always_denses=1对应于仅拒绝过的访客8,not exists操作员应执行以下操作:
SELECT group_id, COUNT(DISTINCT visitor_id) AS always_declines
FROM customer_actions ca1
WHERE NOT EXISTS (SELECT *
FROM customer_actions ca2
WHERE ca1.group_id = ca2.group_id AND
ca1.visitor_id = ca2.visitor_id AND
ca2.outcome != 'declined')
GROUP BY group_id;
一种方法是将其作为两个聚合。首先,按团体和访客进行聚合,以获得合适的访客。然后计算剩余的行数:
SELECT group_id, count(*) AS always_declines
FROM (SELECT group_id, visitor_id
FROM customer_actions
GROUP BY group_id, visitor_id
HAVING SUM(outcome <> 'declined') = 0
) gv
GROUP BY group_id;
抱歉,这不起作用。它返回的值为3,而不是1,表示“总是”递减。@JonRobinson。当然了。不需要where子句。此解决方案实际上要快得多。