1. 引言
上回Void同学主要聊了聊他对使用过的数据仓库的体验和测评。与Void"花式干饭"不同,本人在工作中主要接触的是Snowflake,以及在不同的平台里连接Snowflake写SQL,也整理一些初入数据分析常踩的坑,希望可以帮助大家绕过这些问题。
2. SQL结构篇
2.1 选择合适驱动表
进行两表或者多表Join的时候,一般会考虑需求和性能两个方面:
- 业务需求上:选择和结果表粒度相同的表作为驱动表:例如,如果结果表是统计某一天一群目标用户的某个行为指标,一般会选择用一张用户表的快照作为驱动表进行筛选,然后左连接相应的用户行为表。
- 性能上:选择小表作为驱动表连接大表,对大表建立索引:如果两张需要Join的表记录数量差异很大,一般会把小表放在前面。因为在表连接时,只有右连接表里的索引会生效,且索引在大表中效率提升更明显。
2.2 join前去重
表连接时,如果没有对两表进行去重,则会因为笛卡尔积出现大量重复记录。一般来说Join前去重方式有以下种:
- distinct 去重
- group by 去重
- 窗口函数 row_number() 去重(注意MySQL 8.0版本以上才可以使用窗口函数)
假设我们目前有两张表,一张员工表dept_emp,包含数据如下: