sql小技巧
传统sql,计算同时安装 百度和微信的人数
select count() from (
select distinct devicenumber from zb_zhw_gx_bi_app.dws_m_cus_label_user_app_info where appcode = 'baidu'
INTERSECT
select distinct devicenumber from zb_zhw_gx_bi_app.dws_m_cus_label_user_app_info where appcode = 'weixin'
);
优化后sql
SELECT COUNT(*) FROM (
SELECT a.devicenumber
FROM dws_m_cus_label_user_app_info a
INNER JOIN dws_m_cus_label_user_app_info b ON a.devicenumber = b.devicenumber
WHERE a.appcode = 'baidu' AND b.appcode = 'weixin'
) AS intersection;
这条SQL语句执行的操作如下:
- 从
dws_m_cus_label_user_app_info
表中选择具有'appcode'为'baidu'或'weixin'的记录。 - 使用
GROUP BY
子句按devicenumber
对记录进行分组。 - 使用
HAVING
子句过滤只保留同时具有'appcode'为'baidu'和'weixin'的记录。 - 最后,通过将结果作为子查询,使用外部查询
SELECT COUNT(*)
计算交集中的记录数。
具体步骤如下:
- 子查询
SELECT devicenumber FROM dws_m_cus_label_user_app_info WHERE appcode IN ('baidu', 'weixin')
检索出具有'appcode'为'baidu'或'weixin'的记录。这个子查询将返回两个'appcode'的所有记录,无论它们是否是相同的设备号。 GROUP BY devicenumber
对子查询的结果按devicenumber
进行分组,这样相同的设备号将被合并为一个组。- 使用
HAVING COUNT(DISTINCT appcode) = 2
来过滤掉只有一个'appcode'的组。只有那些同时具有'appcode'为'baidu'和'weixin'的组将被保留下来。 - 最后,外部查询
SELECT COUNT(*)
对子查询的结果进行计数,返回交集中的记录数作为最终结果。
这种优化的查询方式可以避免使用INTERSECT
操作符,提高查询性能,并以更高效的方式计算交集中的记录数。