SQL Server T-SQL Count Distinct

2022-02-10

邁向資料科學家之路,活用 T-SQL Query 洞見資料、發掘價值。本次要介紹的是 Count Distinct 技巧 🙂

SQL Server Logo

說明

如何從左邊的 Table 經由 Select 得到右邊 Table 的結果?將原本的資料,根據日期計算每日的不同人員數與訊息總數。

Challenge

Do It Hard Way

使用 LEFT JOIN 加上 SubQuery

SELECT A.日期, A.人員數, B.訊息數
(
  SELECT 日期, Count(*) 人員數
  FROM 資料表
  GROUP BY 日期
) A
LEFT JOIN
(
  SELECT 日期, SUM(人數)
  FROM
  (
    SELECT 日期, 1 人數
    FROM 資料表
    GROUP BY 日期, 人員
  ) C
  GROUP BY C.日期
) B
ON A.日期 = B.日期

目前的 B Query 過於複雜,可以利用 Distinct 進行語法的精簡,但效能不會改變:

SELECT B.日期, B.SUM(人員)
FROM
(
  SELECT DISTINCT 日期, 人員, 1 AS 人數
  FROM 資料表
) B
GROUP BY B.日期

就在這時搔首困頓,並且一再的問自己真的只能這樣了嗎?最後是 StackOverFlow 輕輕地說你還有更好地選擇。

Count Distinct

SELECT COUNT(DISTINCT 人員), COUNT(*), 日期
FROM 資料表
GROUP BY 日期

不僅語法簡潔優雅,從 SQL Server Management Studio 的評估上效能更勝於 Sub Query 的查詢方式,帥耶 😎

相關連結

SQL Server Integrated Service 初探

SQL Server 閃電般快速查詢指南⚡

SQL Server 周邊工具彙整筆記

SQL Server 學習資源筆記