对于您描述的表格的已知列数 - 实际上不是平均值,它是一个计数 - 可以使用IF 完成:
SELECT Product,
SUM(IF(VisitDayBeforePurchase = 0, 1, 0)) AS Day0,
SUM(IF(VisitDayBeforePurchase = 1, 1, 0)) AS Day1,
SUM(IF(VisitDayBeforePurchase = 2, 1, 0)) AS Day2
FROM yourtable
GROUP BY Product;
基本上,我想查看某人在购买特定产品前 X 天访问网站的平均访问次数。即访问前每天每个产品的总和(访问)/总和(唯一访问者)
这是一个不同的请求。您可以通过添加(或替换)一列来做到这一点
SELECT Product,
AVG(VisitDayBeforePurchase) AS AverageDays
FROM yourtable
GROUP BY Product;
这给了你一切(你可以在行动中看到它here)。
SELECT Product,
SUM(IF(VisitDayBeforePurchase = 0, 1, 0)) AS Day0,
SUM(IF(VisitDayBeforePurchase = 1, 1, 0)) AS Day1,
SUM(IF(VisitDayBeforePurchase = 2, 1, 0)) AS Day2,
AVG(VisitDayBeforePurchase) AS AverageDays
FROM yourtable
GROUP BY Product;
计算多个访问者
简而言之:这很复杂,也许最好不要这样做。
假设我们有一个产品被同一访问者查看两次(或更多),那么我们不想将这些视为单独的访问。如果先生。 X访问了网站三天,两天,购买当天,我们怎么办?
乍一看,我们可能会认为只计算最后次访问。但是我们会得到一个明显的意想不到的后果:由于您必须访问该网站才能在该网站上购买商品,那么购买之前的最后一次访问是您进行购买的访问,因此在购买之前总是零天。在同一小时和一分钟内,甚至,可能。虽然可以考虑上次访问,但它会给我们带来毫无价值的结果。
考虑到第一次访问也会产生忽略重复购买的意外后果,因此我们的最佳重复客户实际上会被认为是最虚伪和优柔寡断的。
因此,例如,只需要考虑实际使用 SUM 制表的天数,然后然后做一些事情:
VisitorID ProductID VDBeforeP
42 137 3
42 137 2
41 137 2
但是怎么办呢?如果我们只考虑访问者 42 的 一个 记录,无论我们做什么我们最终都会得到一个不正确的结果,要么平均而言过于乐观,要么平均而言过于悲观。我们可以考虑用户 42 的 average,对于权重 one(而不是 two)的用户 42,它给出了 2.5,因此与“brute平均”(上面的解决方案)我们有点少考虑重复客户。
为此,我们使用SUBSELECT:我们获得每个数据点只有一个访客和产品的平均数据
SELECT VisitorID, Product, AVG(VisitDayBeforePurchase) AS VisitDayBeforePurchase
FROM visits GROUP BY VisitorID, Product;
这将生成一个与原始表格格式相同但包含平均数据的表格。 而且它永远不会起作用,因为原始查询只验证了 整数 天数,而 2.5 既不是 2 也不是 3。所以我们必须做出乐观或悲观的修正;这是乐观的
SELECT VisitorID, Product, FLOOR(AVG(VisitDayBeforePurchase)) AS VisitDayBeforePurchase
FROM visits GROUP BY VisitorID, Product;
而悲观者会使用FLOOR(1.0+AVG...。折衷方案是使用ROUND。
现在我们重复查询:
SELECT Product,
SUM(IF(V = 0, 1, 0)) AS Day0,
SUM(IF(V = 1, 1, 0)) AS Day1,
SUM(IF(V = 2, 1, 0)) AS Day2,
AVG(BetterV) AS AverageDays
FROM (
SELECT VisitorID,
Product,
ROUND(AVG(VisitDayBeforePurchase)) AS V,
AVG(VisitDayBeforePurchase) AS BetterV
FROM visits GROUP BY VisitorID, Product
) AS grouped
GROUP BY Product;
A working example can be also found here
Map-Reduce
要在 map-reduce 环境中运行上述操作,您需要两个阶段:一个直接输出 VisitorID、Product 和 VisitDayBeforePurchase 的 map 阶段,以及一个通过键(VisitorID、Product)分组并输出这些和 V 的 reduce 阶段(还有 BetterV?)计算结果。
这被馈送到一个新的 reduce 阶段,该阶段对 V 执行平均。