Sql-Server

三列表內的集合(或視窗)內的最小值

  • May 2, 2016

我只有 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;

引用自:https://dba.stackexchange.com/questions/137011