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
操作符,提高查询性能,并以更高效的方式计算交集中的记录数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)