前面幾天一直反覆提到 analytical 的 query 常常會有很多 aggregate,但我們經常需要對同一個aggregate 進行不同的版本操作,雖然 SQL 的 CASE 語句可能是大家首先想到的解法,但其實還有一個替代方案,那就是 FILTER Clause。
FILTER 語句通過允許在聚合函數中直接應用 像是WHERE 條件,提升了 SQL 的可讀性,簡化了創建多種聚合操作的過程。
有些人可能會覺得 Filter 語句在思考模式上更直觀。
這是一個很好的例子,展示了如何通過不同的 SQL 語法實現相同的結果。我個人是偏好 Filter Clause 拉
SELECT
count(*) FILTER (WHERE salary BETWEEN 6500 AND 7200) AS mid_salary_employees,
count(*) FILTER (WHERE salary > 8000) AS high_salary_employees,
avg(salary) FILTER (WHERE salary BETWEEN 6500 AND 7200) AS avg_mid_salary,
avg(salary) FILTER (WHERE salary > 8000) AS avg_high_salary
FROM 'https://ironman24.douenergy.com/employees.parquet';
SELECT
count(CASE WHEN salary BETWEEN 6500 AND 7200 THEN 1 END) AS mid_salary_employees,
count(CASE WHEN salary > 8000 THEN 1 END) AS high_salary_employees,
avg(CASE WHEN salary BETWEEN 6500 AND 7200 THEN salary END) AS avg_mid_salary,
avg(CASE WHEN salary > 8000 THEN salary END) AS avg_high_salary
FROM employee;
注意:要理解的是,FILTER 語句中的 WHERE 條件和查詢中 FROM 語句後的 WHERE 條件是不同的。它們可以共存,但 FILTER 語句中的 WHERE 條件只會影響特定的聚合函數,而不是整個查詢。
趕快到 DuckDB WASM 或 Colab 試試看吧!
今天差點斷更 = =