Live2D

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操作符,提高查询性能,并以更高效的方式计算交集中的记录数。

posted @ 2023-05-31 16:49  没有梦想的java菜鸟  阅读(8)  评论(0编辑  收藏  举报