昨天提到 GROUP BY ALL
讓我們在做資料聚合時更加方便,今天我們來看另一個類似的概念
ORDER BY ALL
ORDER BY ALL 這個功能是為了讓 SQL 的排序過程更加直覺且簡單。一般來說,當我們需要排序結果時,會在 ORDER BY 子句中明確列出每一個需要排序的欄位,例如:
SELECT department, sum(salary)
FROM 'https://ironman24.douenergy.com/employees.parquet'
GROUP BY ALL
ORDER BY department, sum(salary)
而使用 ORDER BY ALL 的話,則不需要手動指定排序欄位。它會自動根據 SELECT 子句中的欄位順序(從左到右)進行排序:
SELECT department, sum(salary)
FROM 'https://ironman24.douenergy.com/employees.parquet'
GROUP BY ALL
ORDER BY ALL;
-- ORDER BY department, sum(salary)
GROUP BY ALL 跟 ORDER BY ALL 是一個我常常在寫簡單的 aggreate 必用的 combo 之一。
我們可以深入探討一下為什麼 ORDER BY ALL
比傳統的 ORDER BY 1, 2
更加方便。實務上,我們常常會調整 SELECT 子句中的欄位順序,或者增加或刪減欄位。當你使用 ORDER BY 1, 2
時,每次改變 SELECT 子句後,都需要在 ORDER BY 子句中做相對應的修改,以確保排序結果是符合預期的。
但使用 ORDER BY ALL,就不需要這樣的額外修改,排序會自動隨著 SELECT 子句的變動來調整。
當然,ORDER BY ALL
也有其限制。當你使用它時,就無法對每個欄位單獨指定排序方向(升冪或降冪)。換句話說,使用 ORDER BY ALL 時,指定的排序方向(例如 DESC 或 ASC)會應用到所有欄位。如果你想要混合排序方向(如 ORDER BY 1 DESC, 2 ASC),那麼 ORDER BY ALL DESC 就無法實現這種效果,因為它會對所有選定的欄位應用相同的排序方式。
總的來說,ORDER BY ALL 是一個方便的工具,特別是在頻繁修改 SELECT 子句時,它能幫助我們避免手動同步更新 ORDER BY 子句。趕快到 DuckDB WASM 或 Colab 試試看吧!