2009-07-29 12 views
0

次のように動作しますが、これが各監査フィールドの最新の値を見つける正しい方法であるかどうかは分かりません。SQLベストプラクティスを選択

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

答えて

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

彼はどこで素晴らしいおもちゃを手に入れますか? –

1

シンプル:

SELECTトップ1 AuditFieldID、AuditValue、AuditDate TBL FROM ためAuditDateによってDES

+0

しかし、動作しません。質問には最新の監査フィールドが記載されています – gbn

0

あなたはすでにTBL Aから選択されている通りである文を必要としません同じフィールドで選択します。

1

これを行う方法はさまざまです。異なる方法が異なる動作をします。このブログでさまざまな方法を説明してください。

Including an Aggregated Column's Related Values

+0

はい、これには5つの異なる方法があり、非常に詳しく説明されています – SQLMenace