2009-07-29 112 views
0

以下工作,我只是想知道這是否是找到每個審計字段的最新值的正確方法。SQL Select最佳實踐

USE tempdb 
CREATE Table Tbl(
TblID Int, 
AuditFieldID Int, 
AuditValue Int, 
AuditDate Date 
) 
GO 
INSERT INTO Tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(1,10,101,'1/1/2001') 
INSERT INTO Tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(2,10,102,'1/1/2002') 
INSERT INTO Tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(3,20,201,'1/1/2001') 
INSERT INTO Tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(4,20,202,'1/1/2009') 


SELECT AuditFieldID,AuditValue,AuditDate 
FROM Tbl A 
WHERE TblID= 
(SELECT TOP 1 TblID 
FROM Tbl 
WHERE AuditFieldID=A.AuditFieldID 
ORDER BY AuditDate DESC 
) 
+2

SQL服務器....?你應該指定你正在使用哪種技術... – womp 2009-07-29 22:21:27

回答

1

骨料/排名拿到鑰匙和最新的日期,加入回去取值。

這是假設的SQL Server 2005+

DECLARE @tbl Table (
TblID Int, 
AuditFieldID Int, 
AuditValue Int, 
AuditDate Date 
) 

INSERT INTO @tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(1,10,101,'1/1/2001') 
INSERT INTO @tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(2,10,102,'1/1/2002') 
INSERT INTO @tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(3,20,201,'1/1/2001') 
INSERT INTO @tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(4,20,202,'1/1/2009') 


;WITH cLatest AS 
(
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY AuditFieldID ORDER BY AuditDate DESC) AS Ranking, 
     AuditFieldID, AuditDate 
    FROM 
     @tbl 
) 
SELECT 
    A.AuditFieldID, A.AuditValue, A.AuditDate 
FROM 
    @tbl A 
    JOIN 
    cLatest C ON A.AuditFieldID = C.AuditFieldID AND A.AuditDate = C.AuditDate 
WHERE 
    C.Ranking = 1 
+0

他從哪裏得到這些奇妙的玩具? – 2009-07-30 18:21:33

1

簡單:

選擇頂層1 AuditFieldID,AuditValue,AuditDate FROM TBL 爲了通過AuditDate DES

+0

但是沒有工作。問題說最新的每個審覈字段 – gbn 2009-07-30 04:53:43

0

你不需要where語句,你已經從一個TBL選擇和選擇相同的字段。