SQL 将数据按行划分

标签 sql aggregate-functions

我有下表名为

表格:事件

userid    appid    type
1         a        imp
2         a        imp
2         a        click
3         a        imp
4         a        imp
4         a        click
5         b        imp
5         b        click

我正在尝试计算每个appid的点击率。在本例中,我们将点击率定义为(点击次数)/(展示次数)。我编写了以下 SQL:

SELECT appid, type, count(*) from activity group by appid, type

并得到以下结果:

输出:

appid    type       count(*)
a        click      2
a        imp        4
b        click      1
b        imp        1

下一步是按行除法。最终,我希望实现以下目标:

目标:

appid    click-through
a        .5                        # 2/4 = .5
b        1                         # 1/1 = 1

这是如何实现的?理想情况下,我希望在一个查询中完成此操作,这可能吗?

最佳答案

您可以使用条件聚合来执行此操作:

   select appid
        , SUM(CASE WHEN type = 'click' THEN 1 END)*1.0
        / SUM(CASE WHEN type = 'imp' THEN 1 END) AS click_through
    from activity
    group by appid

演示:SQL Fiddle

如果使用 MySQL,您可以进一步简化:

   select appid
        , SUM(type = 'click')*1.0
        / SUM(type = 'imp') AS click_through
    from activity
    group by appid

关于SQL 将数据按行划分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28703538/

相关文章:

SQL查询删除两年以上的记录

sql - SQLite查询结构。这可能是多对多的关系,我不知道

mysql - 我们可以将 M2M 关系的 PK 用于另一个 M2M 表吗?

sql-server - 如何在不使用 SQL Server 中的子查询的情况下连接 GROUP BY 子句中的字符串而无需额外的查询?

sql - PostgreSQL - 元素数量有限的 string_agg

mysql - 如何在单个 sql 中对两个单元格进行分组

python - 正则表达式:如何在不混合输出的情况下分离已解析的元素

mysql - 无效操作: column "[column_name]" must appear in the GROUP BY clause or be used in an aggregate function;

python - 如何聚合 NumPy 记录数组(总和、最小值、最大值等)?

mysql - 连接表但需要 0 空行