SQL 学习记录(1 / N)
– case when
当原来的表字段中,没有现成的字段名,需要通过一些条件和计算来生成新的字段和字段下的多个值,可以通过 case when 来实现。
例:
有一个推荐队列的数据表 table_1,记录了每个推荐位置的序号(position)、每个推荐位置的曝光人数(exp_uv)。
position | exp_uv |
---|---|
1 | 400 |
2 | 300 |
3 | 100 |
4 | 80 |
5 | 50 |
6 | 20 |
现在我们有个需求,想要把 2~4 位的曝光人数整合成一个整体、4 位之后的曝光人数整合成一个整体,只看推荐位1、2~4、5 及以上,三个部分各有多少曝光人数。并形成一个「长表」,而不是「宽表」。
select
case when position == 1 then '第 1 位'
when position between 2 and 5 then '2 ~ 4 位'
when position > 5 then '第 5 位及以上'
end as position_new,
distinct exp_uv
from table_1
group by position_new,exp_uv
order by position_new,exp_uv desc
就得到了一个新的字段 position_new
position_new | exp_uv |
---|---|
第 1 位 | 400 |
2 ~ 4 位 | 300 |
第 5 位及以上 | 50 |
题外话:那「宽表」长啥样呢?如下表。这种宽表不利于我们去做进一步分析,所以如果需要对导出的数据做进一步分析的话,会选择长表。
第 1 位 | 2 ~ 4 位 | 第 5 位及以上 |
---|---|---|
400 | 300 | 50 |