如何组合2个SQL查询并检索累积计数?

mat*_*hew 7 mysql sql

我正在尝试检索特定A/B测试组合每天的访问次数和转化次数.每种组合代表A/B测试的不同变化.在这里,我只使用'1''2'代表变化,但从技术上讲,可能会有更多的变化.

我写了以下2个查询,它们独立工作.是否可以组合这些或写一个检索我想要的数据的查询?

访问查询:

SELECT DATE(visit.created), visit.combination, COUNT(visit.id) 
FROM visit 
WHERE visit.user_id = 6
AND visit.experiment_id = 1
GROUP BY DATE(visit.created), visit.combination
Run Code Online (Sandbox Code Playgroud)

访问结果:

在此输入图像描述

转化查询:

SELECT DATE(conversion.created), conversion.combination, COUNT(conversion.id) 
FROM conversion 
WHERE conversion.user_id = 6
AND conversion.experiment_id = 1
AND conversion.goal_id = 1
GROUP BY DATE(conversion.created), conversion.combination
Run Code Online (Sandbox Code Playgroud)

转化结果:

转换结果

如果我可以检索一个正在运行的总计(累计)计数,如下所示,请查看最后两列.我已经按照组合对下表进行了分组,因此累积计数更容易理解:

+---------------+-------------+----------------------+-----------------+--------------+--------------+
| DATE(created) | combination | COUNT(conversion.id) | COUNT(visit.id) | cumulative_c | cumulative_v |
+---------------+-------------+----------------------+-----------------+--------------+--------------+
| 2015-11-17    | 1           |                    1 |               3 |            1 |            3 |
| 2015-11-18    | 1           |                    7 |               4 |            8 |            7 |
| 2015-11-19    | 1           |                    3 |               8 |           11 |           15 |
| 2015-11-17    | 2           |                    4 |               1 |            4 |            1 |
| 2015-11-18    | 2           |                    2 |               6 |            6 |            7 |
| 2015-11-19    | 2           |                    9 |               6 |           15 |           13 |
+---------------+-------------+----------------------+-----------------+--------------+--------------+
Run Code Online (Sandbox Code Playgroud)

数据库架构:

在此输入图像描述

Tim*_*ler 4

组合非常简单:添加 0 值列,执行UNION_ALL,然后再次分组并求和。

SELECT dt, combination, SUM(v_count) as v_count, SUM(c_count) as c_count
FROM 
(
SELECT DATE(visit.created) as dt, visit.combination as combination, COUNT(visit.id) as v_count, 0 as c_count
FROM visit 
WHERE visit.user_id = 6
AND visit.experiment_id = 1
GROUP BY DATE(visit.created), visit.combination

UNION ALL

SELECT DATE(conversion.created) as dt, conversion.combination as combination, 0 as v_count, COUNT(conversion.id) as c_count
FROM conversion 
WHERE conversion.user_id = 6
AND conversion.experiment_id = 1
AND conversion.goal_id = 1
GROUP BY DATE(conversion.created), conversion.combination
) as t
GROUP BY dt, combination
Run Code Online (Sandbox Code Playgroud)

现在,运行总计。在更高级的 DBMS 中,这称为“窗口”或“分析”函数。例如,在 Oracle 中您可以这样做:

SELECT dt, combination, SUM(v_count) OVER (PARTITION BY combination ORDER BY dt) as v_cumulative
Run Code Online (Sandbox Code Playgroud)

对于上面的查询,它会给你你想要的。然而MySQL没有这样的功能。有很多方法,例如这里这里描述的,但它们非常棘手。