記錄用戶購電信息:繳費時間、用戶 ID、用戶名、購電量、購電時間。需計算「兩次購電間隔期間的日均用電量」並存入新表。
CREATE TABLE PurchaseCurrent (
Id UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(), -- UUID 主鍵,避免熱點
UserId BIGINT NOT NULL,
UserName NVARCHAR(50) NOT NULL,
Amount DECIMAL(10,2) NOT NULL, -- 購電量
PurchaseTime DATETIME2 NOT NULL, -- 購電時間
CreateTime DATETIME2 NOT NULL DEFAULT SYSUTCDATETIME(),
CONSTRAINT UX_UserId UNIQUE (UserId) -- 單用戶僅保留最新一條
);
✅ UUID 主鍵避免自增熱點
✅ 用戶 ID 唯一索引保證單用戶最新記錄
CREATE TABLE PurchaseHistory (
Id BIGINT IDENTITY(1,1) PRIMARY KEY, -- 自增主鍵,寫入快
UserId BIGINT NOT NULL,
Amount DECIMAL(10,2) NOT NULL,
PurchaseTime DATETIME2 NOT NULL,
PrevPurchaseTime DATETIME2 NULL, -- 上次購電時間(冗余便於查詢)
DailyAvg DECIMAL(10,4) NULL, -- 計算出的日均用電量
CreateTime DATETIME2 NOT NULL DEFAULT SYSUTCDATETIME(),
INDEX IX_UserId_PurchaseTime (UserId, PurchaseTime)
);
WITH Ranked AS (
SELECT
UserId,
Amount,
PurchaseTime,
LAG(PurchaseTime) OVER (PARTITION BY UserId ORDER BY PurchaseTime) AS PrevTime,
LAG(Amount) OVER (PARTITION BY UserId ORDER BY PurchaseTime) AS PrevAmount
FROM PurchaseHistory
)
SELECT
UserId,
PurchaseTime,
PrevAmount * 1.0 / NULLIF(DATEDIFF(DAY, PrevTime, PurchaseTime), 0) AS DailyAvg
FROM Ranked
WHERE PrevTime IS NOT NULL;
採用當前表 + 歷史表雙表模式,主鍵用 UUID 避免熱點,歷史表用自增主鍵提升寫入性能。通過觸發器或應用層在購電瞬間完成「歸檔舊記錄 + 計算日均 + 更新當前」原子操作,滿足幾十萬量級下的高併發寫入與靈活查詢需求。