WITH AAA AS( SELECT VipMemberInfo_FullName,VipMemberInfo_Birthday,DATEDIFF(DAY,GETDATE(),DATEADD(YEAR,65,VipMemberInfo_Birthday)) AS wait_retire_days FROM VipMemberInfo(NOLOCK) WHERE VipMemberInfo_ValidFlag =1 AND VipMemberInfo_Birthday ISNOTNULL ) SELECT VipMemberInfo_FullName,VipMemberInfo_Birthday,wait_retire_days,CASE when (wait_retire_days <=0) THEN N'待退弟兄'ELSE N'好好工作' ENDAS N'退休狀態' FROM AAA
🏪 時間分群模式:把時間軸切成段落
每月訂單數量、每日銷售額
每月註冊會員數、登入數
每小時玩家登入人數
月份
方法一:MONTH 函式
1 2 3 4 5 6 7 8 9 10
use WebStoreDB;
with aaa as( SELECTMONTH(TradesOrderGroup_DateTime) AS Year_Mon,* FROM TradesOrderGroup(NOLOCK) WHERE TradesOrderGroup_ValidFlag =1 AND TradesOrderGroup_DateTime >='2025-01-01') select Year_Mon as N'年月',count(*) as N'訂單數量' from aaa GROUPby Year_Mon
運算結果為整數,排序與計算都快
CPU 成本低
不吃索引(欄位被函式包住)
只顯示月份(無法區分跨年資料)
👉 適合中型資料量的快速月報分析。
📅 方法二:CONVERT 函式
1 2 3 4 5 6 7 8
with aaa as( SELECTCONVERT(VARCHAR(7), TradesOrderGroup_DateTime, 120) AS Year_Mon,* FROM TradesOrderGroup(NOLOCK) WHERE TradesOrderGroup_ValidFlag =1 AND TradesOrderGroup_DateTime >='2025-01-01') select Year_Mon as N'年月',count(*) as N'訂單數量' from aaa GROUPby Year_Mon
同樣不吃索引(函式包欄位)
但還要多做「日期 → 字串」的轉換
字串運算成本比整數高,而且排序時需要字元比較(collation)
結果雖然可讀性高,但效能會稍微差一點
相對較適合跨年份分析,結果包含年份和月份
👉 適合報表輸出(例如要顯示 ‘2025-01’ 這種格式),但犧牲效能。
對齊模式:每分鐘、每小時的統計
每分鐘登入人數統計
每 5 分鐘 API 呼叫次數
每小時交易數量
1 2 3 4 5 6 7 8 9 10
WITH AAA AS( SELECT dateadd(MINUTE,DATEDIFF(MINUTE,0,Task_CreatedDatetime),0) AS task_by_min FROM Task(NOLOCK) WHERE Task_JobId =6 AND Task_CreatedDatetime >='2025-10-26 00:00:00' AND Task_CreatedDatetime <'2025-10-27 00:00:00' ) select task_by_min,COUNT(*) from AAA GROUPBY task_by_min
周
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
USE ERPDB;
WITH A AS ( SELECT SalesOrderGroup_DateTime, SalesOrderGroup_TotalPayment FROM SalesOrderGroup(NOLOCK) WHERE SalesOrderGroup_ValidFlag =1 AND SalesOrderGroup_DateTime >='2025-06-01' AND SalesOrderGroup_DateTime <'2025-07-01' ) SELECT DATEPART(WEEK, SalesOrderGroup_DateTime) - DATEPART(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, SalesOrderGroup_DateTime), 0)) +1AS 當月第幾週, AVG(SalesOrderGroup_TotalPayment) AS 週平均消費 FROM A GROUPBY DATEPART(WEEK, SalesOrderGroup_DateTime) - DATEPART(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, SalesOrderGroup_DateTime), 0)) +1;