我使用自動遞增標識列添加到歷史記錄表中,通過查詢現有表和表上的問題來解決您的問題。通過在歷史記錄表上添加自動遞增標識列,您可以避開日期的獨特問題,並使查詢變得更加簡單。
爲了解決您的表的問題(與SQL Server實例代碼):
DECLARE @MasterTable table (MasterID int,FirstName varchar(20),LastName varchar(20))
DECLARE @HistoryTable table (MasterID int,LastAction char(1),HistoryDate datetime)
INSERT INTO @MasterTable VALUES (1,'AAA','aaa')
INSERT INTO @MasterTable VALUES (2,'BBB','bbb')
INSERT INTO @MasterTable VALUES (3,'CCC','ccc')
INSERT INTO @HistoryTable VALUES (1,'I','1/1/2009')
INSERT INTO @HistoryTable VALUES (1,'U','2/2/2009')
INSERT INTO @HistoryTable VALUES (1,'U','3/3/2009') --<<dups
INSERT INTO @HistoryTable VALUES (1,'U','3/3/2009') --<<dups
INSERT INTO @HistoryTable VALUES (2,'I','5/5/2009')
INSERT INTO @HistoryTable VALUES (3,'I','7/7/2009')
INSERT INTO @HistoryTable VALUES (3,'U','8/8/2009')
SELECT
MasterID,FirstName,LastName,LastAction,HistoryDate
FROM (SELECT
m.MasterID,m.FirstName,m.LastName,h.LastAction,h.HistoryDate,ROW_NUMBER() OVER(PARTITION BY m.MasterID ORDER BY m.MasterID) AS RankValue
FROM @MasterTable m
INNER JOIN (SELECT
MasterID,MAX(HistoryDate) AS MaxDate
FROM @HistoryTable
GROUP BY MasterID
) dt ON m.MasterID=dt.MasterID
INNER JOIN @HistoryTable h ON dt.MasterID=h.MasterID AND dt.MaxDate=h.HistoryDate
) AllRows
WHERE RankValue=1
OUTPUT:
MasterID FirstName LastName LastAction HistoryDate
----------- --------- -------- ---------- -----------
1 AAA aaa U 2009-03-03
2 BBB bbb I 2009-05-05
3 CCC ccc U 2009-08-08
(3 row(s) affected)
爲了一個更好的,HistoryTable解決問題(與SQL服務器示例代碼): 這是更好的,因爲它具有自動遞增歷史ID標識列
DECLARE @MasterTable table (MasterID int,FirstName varchar(20),LastName varchar(20))
DECLARE @HistoryTableNEW table (HistoryID int identity(1,1), MasterID int,LastAction char(1),HistoryDate datetime)
INSERT INTO @MasterTable VALUES (1,'AAA','aaa')
INSERT INTO @MasterTable VALUES (2,'BBB','bbb')
INSERT INTO @MasterTable VALUES (3,'CCC','ccc')
INSERT INTO @HistoryTableNEW VALUES (1,'I','1/1/2009')
INSERT INTO @HistoryTableNEW VALUES (1,'U','2/2/2009')
INSERT INTO @HistoryTableNEW VALUES (1,'U','3/3/2009') --<<dups
INSERT INTO @HistoryTableNEW VALUES (1,'U','3/3/2009') --<<dups
INSERT INTO @HistoryTableNEW VALUES (2,'I','5/5/2009')
INSERT INTO @HistoryTableNEW VALUES (3,'I','7/7/2009')
INSERT INTO @HistoryTableNEW VALUES (3,'U','8/8/2009')
SELECT
m.MasterID,m.FirstName,m.LastName,h.LastAction,h.HistoryDate,h.HistoryID
FROM @MasterTable m
INNER JOIN (SELECT
MasterID,MAX(HistoryID) AS MaxHistoryID
FROM @HistoryTableNEW
GROUP BY MasterID
) dt ON m.MasterID=dt.MasterID
INNER JOIN @HistoryTableNEW h ON dt.MasterID=h.MasterID AND dt.MaxHistoryID=h.HistoryID
OUTPUT:
MasterID FirstName LastName LastAction HistoryDate HistoryID
----------- --------- -------- ---------- ----------------------- ---------
1 AAA aaa U 2009-03-03 00:00:00.000 4
2 BBB bbb I 2009-05-05 00:00:00.000 5
3 CCC ccc U 2009-08-08 00:00:00.000 7
(3 row(s) affected)
什麼數據庫(包括版)? – 2009-09-09 15:39:20