首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

DISTINCT ID 取法:取得各群組最大值對應的完整記錄

     編輯:關於SqlServer

需求:從 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;

邏輯說明

  1. 將原表複製到暫存表 #MYTBL。
  2. 計算每個 ID 的最大 COST 存入 #MYTEMP。
  3. 刪除 #MYTBL 中 COST 不等於最大值的列。
  4. 剩餘即為各群組最大值的完整記錄。

此法思路清晰,適合中小資料量;大數據量建議改用 ROW_NUMBER() 視窗函數(SQL Server 2005+ 支援)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved