3 回答

TA貢獻1860條經(jīng)驗 獲得超9個贊
;WITH cte AS( SELECT *, ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn FROM DocumentStatusLogs)SELECT *FROM cteWHERE rn = 1
在2個地方保持狀態(tài) 保存狀態(tài)歷史 ...

TA貢獻1830條經(jīng)驗 獲得超9個贊
cross apply
select d.DocumentID, ds.Status, ds.DateCreated from Documents as d cross apply (select top 1 Status, DateCreated from DocumentStatusLogs where DocumentID = d.DocumentId order by DateCreated desc) as ds

TA貢獻1942條經(jīng)驗 獲得超3個贊
我在這里對各種建議做了一些時間安排,結(jié)果實際上取決于所涉及的表的大小,但最一致的解決方案是使用交叉應用-這些測試是針對SQLServer2008-R2運行的,使用的是一個記錄為6500條的表,以及另一個記錄為1.37億條的表(相同的模式)。正在查詢的列是表中主鍵的一部分,表的寬度非常小(約30字節(jié))。SQLServer根據(jù)實際執(zhí)行計劃報告時間。
Query Time for 6500 (ms) Time for 137M(ms)
CROSS APPLY 17.9 17.9
SELECT WHERE col = (SELECT MAX(COL)…) 6.6 854.4
DENSE_RANK() OVER PARTITION 6.6 907.1
我認為真正令人驚訝的是,無論涉及的行數(shù)如何,交叉應用的時間是多么一致。
添加回答
舉報