iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
AI/ ML & Data

粗暴的資料處理 DuckDB系列 第 11

Day11 -- DuckDB Style SQL (5) ?

  • 分享至 

  • xImage
  •  

前面幾天一直反覆提到 analytical 的 query 常常會有很多 aggregate,但我們經常需要對同一個aggregate 進行不同的版本操作,雖然 SQL 的 CASE 語句可能是大家首先想到的解法,但其實還有一個替代方案,那就是 FILTER Clause。

FILTER 語句通過允許在聚合函數中直接應用 像是WHERE 條件,提升了 SQL 的可讀性,簡化了創建多種聚合操作的過程。

有些人可能會覺得 Filter 語句在思考模式上更直觀。

這是一個很好的例子,展示了如何通過不同的 SQL 語法實現相同的結果。我個人是偏好 Filter Clause 拉

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';

CASE WHEN 寫法


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 試試看吧!

今天差點斷更 = =


上一篇
Day10 -- DuckDB Style SQL (4) ?
下一篇
Day12 -- DuckDB Style SQL (6) ?
系列文
粗暴的資料處理 DuckDB30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言