优化代码select a.*,b.predict_day from dw.ol_autotask_model_channels_predict_content a left join ( select cust_id, sum(case when predict in ('other', 'middle') then 0 else 1 end) predict_day, dt from dw.ol_autotask_model_channels_predict_content where dt = '20230601' group by cust_id, dt ) b on a.cust_id = b.cust_id and a.dt = b.dt where a.dt='20230601' and b.predict_day = 0 limit 50
时间: 2024-04-07 08:33:34 浏览: 54
你的查询代码已经很不错了,不过仍然可以进行一些优化。以下是对你的查询进行优化的建议:
1. 使用内连接代替左连接:根据查询条件,你只关心预测天数为0的记录。因此,可以将左连接改为内连接,这样可以减少JOIN的数据量。
2. 将子查询的结果作为临时表:将子查询的结果作为一个临时表,并使用该临时表进行JOIN操作,可以提高查询效率。
3. 移除无用的条件:由于子查询已经限定了日期(dt = '20230601'),在主查询中再次限定日期是多余的,可以移除这个条件。
优化后的查询代码如下:
```sql
WITH temp_table AS (
SELECT cust_id, sum(CASE WHEN predict IN ('other', 'middle') THEN 0 ELSE 1 END) AS predict_day
FROM dw.ol_autotask_model_channels_predict_content
WHERE dt = '20230601'
GROUP BY cust_id
)
SELECT a.*, b.predict_day
FROM dw.ol_autotask_model_channels_predict_content a
JOIN temp_table b ON a.cust_id = b.cust_id
WHERE a.dt = '20230601'
AND b.predict_day = 0
LIMIT 50;
```
通过使用临时表和内连接,可以提高查询效率。请根据需要进行适当调整,并确保表名、列名和约束条件与你的实际情况相匹配。
阅读全文