ID Time Pos Result
1 15:00:1 1 true
1 15:00:1 2 true
1 15:00:1 3 true
1 15:00:1 4 true <-- 完整組,全 true
1 15:00:2 1 true
1 15:00:2 2 true <-- 不完整組 (缺 3,4)
3 15:00:1 1 true
3 15:00:1 2 false <-- 完整組,含 false
3 15:00:1 3 true
3 15:00:1 4 true
ID, Time 為唯一鍵分組。Pos = 1,2,3,4 四筆資料,始視為「完整組」。Result 全為 true → 計為 true;否則 false。ID 有多組完整資料時,**取最新 (Time 最大) 那一組**判斷。WITH CompleteGroups AS (
SELECT
ID,
Time,
COUNT(DISTINCT Pos) AS pos_cnt,
MIN(CASE WHEN Result = 'true' THEN 1 ELSE 0 END) AS all_true
FROM YourTable
WHERE Pos IN (1,2,3,4)
GROUP BY ID, Time
HAVING COUNT(DISTINCT Pos) = 4
),
LatestPerID AS (
SELECT
ID,
all_true,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Time DESC) AS rn
FROM CompleteGroups
)
SELECT
ID,
CASE WHEN SUM(all_true) > 0 THEN 1.0 * SUM(all_true) / COUNT(*) ELSE 0 END AS true_ratio
FROM LatestPerID
WHERE rn = 1
GROUP BY ID;
false,MIN 為 0,等同「全 true」判斷。CREATE INDEX idx_id_time_pos ON YourTable(ID, Time, Pos); 大幅加速分組與排序。上述語法支援所有支援 CTE 與視窗函數的現代資料庫。若為 MySQL 5.7,需改用變數模擬 ROW_NUMBER 或子查詢取 MAX(Time)。