优化代码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 支付日期 < '2022-10-30' AND 支付日期 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;
时间: 2024-01-08 08:04:43 浏览: 61
代码优化方式
可以尝试对该 SQL 语句进行如下优化:
1. 建立索引:可以对用户id、支付日期和商品实付金额这三个字段建立索引,以提高查询效率。
2. 减少子查询:可以将子查询中的用户id结果集存储到一个临时表中,避免每次查询都执行子查询。
3. 使用EXISTS关键字:可以用 EXISTS 关键字代替 LEFT JOIN,以提高查询效率。
4. 减少DISTINCT关键字:可以通过调整查询逻辑,避免使用 DISTINCT 关键字。
优化后的 SQL 语句如下:
```
CREATE TEMPORARY TABLE IF NOT EXISTS old_c (
用户id INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (用户id)
);
INSERT INTO old_c (用户id)
SELECT DISTINCT 用户id
FROM 天猫官旗有效数据
WHERE 支付日期 < '2022-10-30'
AND 支付日期 BETWEEN '2021-10-31' AND '2022-10-30';
SELECT 子品牌, `商品数字ID`, COUNT(o.用户id) AS new_customer_num, SUM(o.商品实付金额) AS new_customer_商品实付金额
FROM 天猫官旗有效数据 o
WHERE o.支付日期 >= '2022-10-31' AND o.支付日期 <= '2022-11-11'
AND NOT EXISTS (
SELECT 1
FROM old_c
WHERE 用户id = o.用户id
)
GROUP BY 1, 2 WITH ROLLUP;
```
注意,以上仅为参考优化方法,具体优化效果还需根据实际情况进行测试。
阅读全文