sql:选择由另一列分组的两列值的计数并获得两个计数的比率

Posted

技术标签:

【中文标题】sql:选择由另一列分组的两列值的计数并获得两个计数的比率【英文标题】:sql: select counts of two column values grouped by another column and get ratio of two counts 【发布时间】:2020-09-20 19:58:28 【问题描述】:

我有一个表格,其中包含按国家/地区标记的各个广告点击次数和广告展示次数。像这样的:

我需要找到每个国家/地区的点击率(ad_click 计数除以 ad_impression 每个国家/地区的计数)。

我可以数数:

SELECT 
    `events_20200918`.`geo`.`country` AS `geo_country`,
    `events_20200918`.`event_name` AS `event_name`,
    count(1) AS `count_of_rows`
FROM `smartsecurity2-fccc6`.`analytics_238757844`.`events_20200918` AS `events_20200918`
WHERE 
    `events_20200918`.`event_name` IN ('S_ad_impression', 'S_ad_click')
GROUP BY
    1,  2 
ORDER BY 
    3 DESC 

结果如下:

但是如何添加每个国家/地区的 ad_click/ad_impression 比率?

【问题讨论】:

【参考方案1】:

如果您希望每个国家/地区有一行,以及点击次数与展示次数的比率,您可以使用条件聚合:

select 
    `geo`.`country` as `geo_country`,
    safe_divide(
        1.0 * countif(`event_name` = 's_ad_click'),
        countif(`event_name` = 's_ad_impression')
    ) as ratio
from `smartsecurity2-fccc6`.`analytics_238757844`.`events_20200918` as `events_20200918`
where `event_name` in ('S_ad_impression', 'S_ad_click')
group by 1

这按国家/地区分组,然后将点击次数除以展示次数。 safe_divide() 避免在一个国家/地区有点击但没有展示的情况下除以 0 错误。

【讨论】:

谢谢,但这会为所有行生成nulls prnt.sc/umupfb

以上是关于sql:选择由另一列分组的两列值的计数并获得两个计数的比率的主要内容,如果未能解决你的问题,请参考以下文章

按另一列值分组和计数

由另一列分组的SQL求和列

在另一列上分组后查找列值的最大出现次数

在使用原始查询时选择比较 ormlite 中的两列值的行

计算同一列之间的差异,在python中由另一列分组的连续行

如何比较按一列分组的 SQL 中的列值?