Engineering · 1 min read
count(*) vs count(欄位):差別就在 NULL
count(*) 會算進含 NULL 的每一列;count(欄位) 只算非 NULL。兩者的差正是缺值的數量——外加用 CASE WHEN 一次數多個條件的技巧。
count() 在 ClickHouse 和 Spark 都能用,是標準的 SQL 命令,用來算 row 數。真正每次卡住的,是它到底算不算 NULL。
count(expr) 或 count(DISTINCT expr)
COUNT(*)或COUNT(1)*→ 所有欄位(whitelist)- 包含 NULL
COUNT(col)- 只算
col不是 NULL 的 row
- 只算
兩者的差,就是該欄位缺值的數量,這也是「有多少 sign-up 沒填 email」最直接的算法。
用 CASE WHEN 一次數多個條件
SELECT
COUNT(CASE WHEN salary > 100000 THEN 1 ELSE NULL END) AS high_earners,
COUNT(CASE WHEN salary <= 100000 THEN 1 ELSE NULL END) AS standard_earners
FROM employees;
- 訣竅:
COUNT(col)只在非 NULL 時 +1,所以把不想算的分支寫成NULL。
參考來源
- ClickHouse
count— https://clickhouse.com/docs/en/sql-reference/aggregate-functions/reference/count - Spark SQL Built-in Functions — https://spark.apache.org/docs/latest/api/sql/
Related: 回到跨引擎資料庫查詢總覽,或在可攜式 SQL 核心裡看它的定位。