首页 > 解决方案 > 在最宽维度上使用 GROUP BY 的 CASE WHEN 语句

问题描述

我正在尝试使用结果 GROUPING 创建一个 CASE WHEN 并对 SQL 表中最广泛的维度进行分类。现在表格看起来像这样:

广告组 关键字名称 广告类型 点击百分比
1 卡车 皮卡 横幅 .3
1 轿车 四门 视频 .2
1 越野车 艰难的 关联 .7
2 卡车 越野 横幅 .6
2 轿车 两门 视频 .7
2 越野车 宽敞 关联 .8

这里最广泛的维度是月份,我有一个基准标识符,如果横幅和视频的 click_percent 超过 0.5,则确定一个唯一月份为“结束”。链接点击在此分类的结果中没有发言权。我的 SQL 语句现在看起来像这样

SELECT *,
    CASE
      WHEN ad_type in ('banner', 'video') and click_% > .5 THEN "Great"
      ELSE "Low"
    END AS benchmark
FROM table

结果,我现在得到:

广告组 关键字名称 广告类型 点击百分比 基准
1 卡车 皮卡 横幅 .3 在下面
1 轿车 四门 视频 .2 在下面
1 越野车 艰难的 关联 .7 在下面
2 卡车 越野 横幅 .6 超过
2 轿车 两门 视频 .7 超过
2 越野车 宽敞 关联 .8 在下面

不幸的是,Link 也是 ad_type 下的一个值,它在同一个月得到了自己的分类。我认为我最大的问题是我没有按月对 CASE WHEN 的结果进行分组。无论有多少 ad_types 或其他更多样化的维度,每个月都应该有一个不同的值,“Over”或“Under”。其他一些注意事项是,此查询是创建此视图的更大查询的一部分,而 click_percent 是一个聚合字段。

这就是我的结果应该是这样的:

广告组 关键字名称 广告类型 点击百分比 基准
1 卡车 皮卡 横幅 .3 在下面
1 轿车 四门 视频 .2 在下面
1 越野车 艰难的 关联 .7 在下面
2 卡车 越野 横幅 .6 超过
2 轿车 两门 视频 .7 超过
2 越野车 宽敞 关联 .8 超过

这是我为了排除故障而尝试的另一个失败的查询:

SELECT month, benchmark
from(
    SELECT
    month, ad_type, click_percent,
    CASE WHEN ad_type in ('banner', 'video') and click_% > .5 THEN "Over"
      ELSE "Under"
    END AS benchmark
    FROM table
    group by month, ad_type, click_percent)
  group by month, benchmark

任何建议或文档都会非常有帮助!让我知道你的想法!

标签: sqlgoogle-bigquery

解决方案


如果您想要带有“over”标志的月份,您可以使用聚合:

SELECT month,
       (CASE WHEN MAX(CASE WHEN ad_type = 'banner' THEN click_% END) > 0.5 AND
                  MAX(CASE WHEN ad_type = 'video' THEN click_% END) > 0.5 
             THEN 'over' ELSE 'low'
        END) as benchmark
FROM table
GROUP BY month;

推荐阅读