MySQL 中使用 sum() 进行独特的行聚合
SQL 查询通常涉及 sum() 等聚合函数来计算数值摘要。处理分组数据时,必须仅对每个唯一记录进行一次计数,以避免结果膨胀。
考虑以下查询:
<code class="sql">SELECT links.id, count(DISTINCT stats.id) as clicks, count(DISTINCT conversions.id) as conversions, sum(conversions.value) as conversion_value FROM links LEFT OUTER JOIN stats ON links.id = stats.parent_id LEFT OUTER JOIN conversions ON links.id = conversions.link_id GROUP BY links.id ORDER BY links.created desc;</code>
目标是计算不同点击的数量、转化次数,并对每个链接相应的转化值求和。但是,由于分组,sum(conversions.value) 聚合会对每个转化值进行多次计数。
为了准确计算每个唯一转化的总和,我们需要调整表达式。假设 conversions.id 是转化表中的主键,我们可以利用不同转化次数与记录总数之间的关系。
对于每个 conversions.id,最多有一个链接.id 受到影响。因此,一次非重复转化的所有转化值的总和可以通过将实际总和(conversions.value) 乘以非重复转化次数并除以组中的记录总数来计算:
<code class="sql">sum(conversions.value) * count(DISTINCT conversions.id) / count(*)</code>
将此调整合并到查询结果中:
<code class="sql">SELECT links.id, count(DISTINCT stats.id) as clicks, count(DISTINCT conversions.id) as conversions, sum(conversions.value)*count(DISTINCT conversions.id)/count(*) as conversion_value FROM links LEFT OUTER JOIN stats ON links.id = stats.parent_id LEFT OUTER JOIN conversions ON links.id = conversions.link_id GROUP BY links.id ORDER BY links.created desc;</code>
此修改后的查询有效地对每个唯一转化的转化值进行求和,为分组数据提供准确的聚合结果。
以上是如何在MySQL中计算不同转换的准确转换值总和?的详细内容。更多信息请关注PHP中文网其他相关文章!