2009-07-29 113 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选择和选择相同的字段。