Sql-Server
三列表內的集合(或視窗)內的最小值
我只有 SQL Server 2008R2,因此我沒有自 SQL Server 2012 以來可用的所有視窗函式。
我有一個看起來像這樣的表:
我想檢索這樣的結果集,其中每個類別都有與最低訂單號相關聯的 ID,以及與最高訂單號相關聯的 ID:
我正在尋找可以執行此操作的 TSQL 選擇語句。
您可以在沒有新的 (2012+) 視窗函式的情況
FIRST_VALUE()
下使用ROW_NUMBER()
. 但你也可以使用OUTER APPLY
:SELECT d.CategorieID, IDMinOrder = a.ID, IDMaxOrder = b.ID FROM ( SELECT DISTINCT CategorieID FROM tableX ) AS d OUTER APPLY ( SELECT TOP (1) a.ID FROM tableX AS a WHERE a.CategorieID = d.CategorieID ORDER BY a."Order" ASC ) AS a OUTER APPLY ( SELECT TOP (1) b.ID FROM tableX AS b WHERE b.CategorieID = d.CategorieID ORDER BY b."Order" Desc ) AS b ;
假設這個樣本數據:
USE tempdb; GO CREATE TABLE dbo.o([Order] INT, ID INT, CategoryID INT); INSERT dbo.o([Order],ID,CategoryID) VALUES (1,100,13), (2,103,13), (3,102,13), (4,105,13), (5,104,13), (6,101,13), (1,201,57), (2,200,57), (3,204,57), (4,203,57), (5,206,57), (6,205,57); GO
我們可以使用 CTE 來確定每個類別的第一行和最後一行,使用
ROW_NUMBER()
自 SQL Server 2005 以來就存在的視窗函式:;WITH x AS ( SELECT CategoryID, ID, mn = ROW_NUMBER() OVER (PARTITION BY CategoryID ORDER BY [Order]), mx = ROW_NUMBER() OVER (PARTITION BY CategoryID ORDER BY [Order] DESC) FROM dbo.o ) SELECT CategoryID = COALESCE(mn.CategoryID, mx.CategoryID), [ID MinOrder] = mn.ID, [ID MaxOrder] = mx.ID FROM x AS mn CROSS JOIN x AS mx WHERE mn.CategoryID = mx.CategoryID AND mn.mn = 1 AND mx.mx = 1;
清理:
DROP TABLE dbo.o;