SQL 编写技巧总结(持续更新中)

UDF 函数整理

用处语法
获取json数据get_json_object(字段,'$.x.x')
截取字符串substr(字段,从第几位开始截取)
字符串日期相减DATEDIFF(日期1,日期2)【yyyy-MM-DD格式】
将一个复杂类型ARRAY或者MAP转换为单行记录SELECT explode(myCol) AS myNewCol FROM myTable;
将使用的表与UTF等函数做结合关联LATERAL VIEW udtf(expression) tableAlias AS columnAlias (‘,’ columnAlias)* fromClause: FROM baseTable (lateralView)*

参考 blog.csdn.net/bitcarmanle…

提升效率

  • 查询必须加分区字段
  • 连表查询,查询条件尽量放在子查询去
  • 子查询不要出现select *

列转行

在一些情况下,我们可能需要列转行的操作 看下面一个case

表TB_A结构如下

datehomepageuv
2018-03-05mp10
2018-03-05zby20
2018-03-06mp40
2018-03-07zby25

我们的需求是统计每天所有门票(mp)和周边游(zby)的所有uv

目标结构是这样

mpzby
5045

这个时候我们可以这么做

  • step1:case when then实现列转行
  • step2:sum聚合实现求和,去除null
select sum(mp) mp,sum(zby) zby
from    (select 
        case when homepage = 'mp' then uv end 'mp'
        case when homepage = 'zby' then uv end 'zby'
    from TB_A)
复制代码

Union

将两个结果集的数据做纵向连接,可以直接作为一个新的结果集,需要两个结果集的返回字段一致

[SQL 1]
union/union all
[SQL 2]
复制代码

分为Union 和 Union All,二者区别如下:

用法区别
union取两个结果集的唯一值
union all直接连接不去重

Join

将两个结果集做横向连接,作为一个新的数据源,放在[from] 里面语句段里面

select [select statement]
from 
t1 left/right/inner/full/outer join t2 on [on statement]
where
[where statement]
复制代码

主要分为 left/right/inner/full/outer join,区别如下

用法区别
left join(left outer join )关联的信息左边数据集有数据即可返回,右边没有返回null
right join(right outer join )关联的信息右边数据集有数据即可返回,右边没有返回null
inner join关联的信息必须左右边数据集都存在
outer/full join关联的信息必须左右边数据集有一方存在即可

grouping sets

grouping sets 可以实现多重聚合

以上这段sql可以使用下面的代码简单的实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值