优化代码 SELECT 子品牌,`商品数字ID`,COUNT(DISTINCT o.用户id) AS new_customer_num, SUM(o.商品实付金额) AS new_customer_商品实付金额 FROM 天猫官旗有效数据 o LEFT JOIN ( -- 找到22年10月30日前有购买行为的客户编号 SELECT DISTINCT 用户id FROM 天猫官旗有效数据 WHERE 支付日期 BETWEEN '2021-10-31'AND '2022-10-30') old_c ON o.用户id = old_c.用户id WHERE o.支付日期 >= '2022-10-31' AND o.支付日期 <= '2022-11-11' AND old_c.用户id IS NULL GROUP BY 1,2 WITH ROLLUP;
时间: 2023-12-31 20:04:07 浏览: 61
这段代码的作用是统计在2022年10月31日至11月11日期间,新客户的购买情况。其中,新客户指的是在2021年10月31日至2022年10月30日期间没有过购买行为的用户。代码中使用了左连接和子查询来实现。
为了优化这段代码,可以考虑以下几点:
1. 对于大表的查询,应该尽可能减少不必要的列和数据。因此,在查询时只选择需要的列,例如只选择子品牌、商品数字ID、用户ID等必要信息,避免不必要的浪费。
2. 当查询涉及到多张表时,应该尽可能使用索引来提高查询效率。在此代码中,可以为用户ID、支付日期等常用字段添加索引。
3. 在子查询中,可以使用 EXISTS 替代 DISTINCT,因为 EXISTS 会在找到第一个匹配项时停止查询,比 DISTINCT 更高效。
4. 在 GROUP BY 子句中,可以使用 GROUPING SETS 替代 WITH ROLLUP,因为 GROUPING SETS 更加灵活,可以根据需要进行分组。
综上所述,以下是优化后的代码:
SELECT
子品牌,
`商品数字ID`,
COUNT(DISTINCT o.用户id) AS new_customer_num,
SUM(o.商品实付金额) AS new_customer_商品实付金额
FROM
天猫官旗有效数据 o
LEFT JOIN (
-- 找到22年10月30日前有购买行为的客户编号
SELECT 用户id
FROM 天猫官旗有效数据
WHERE 支付日期 BETWEEN '2021-10-31' AND '2022-10-30'
GROUP BY 用户id
) old_c ON o.用户id = old_c.用户id
WHERE
o.支付日期 >= '2022-10-31'
AND o.支付日期 <= '2022-11-11'
AND NOT EXISTS (
SELECT 1
FROM 天猫官旗有效数据
WHERE 用户id = o.用户id
AND 支付日期 BETWEEN '2021-10-31' AND '2022-10-30'
)
GROUP BY GROUPING SETS ((子品牌, `商品数字ID`))
阅读全文