需求:從 t_test 表中,取出每個 ID 群組裡 COST 最大的那筆完整記錄。
ID COST DES AUTOID
1 10 aaaa 1
1 15 bbbb 2
1 20 cccc 3
2 80 aaaa 4
2 100 bbbb 5
2 60 dddd 6
3 500 dddd 7
ID COST DES AUTOID
1 20 cccc 3
2 100 bbbb 5
3 500 dddd 7
單一 SELECT 難以直接達標,改用預存程序分步驟處理:
CREATE PROCEDURE SP_TEST
AS
BEGIN
SELECT * INTO #MYTBL FROM T_TEST;
SELECT ID, MAX(COST) AS MAX_COST
INTO #MYTEMP
FROM T_TEST
GROUP BY ID
HAVING COUNT(*) > 1;
DELETE #MYTBL
FROM #MYTEMP, #MYTBL
WHERE #MYTBL.ID = #MYTEMP.ID
AND #MYTBL.COST <> #MYTEMP.MAX_COST;
SELECT * FROM #MYTBL;
END;
EXEC SP_TEST;
#MYTBL。#MYTEMP。#MYTBL 中 COST 不等於最大值的列。此法思路清晰,適合中小資料量;大數據量建議改用 ROW_NUMBER() 視窗函數(SQL Server 2005+ 支援)。