SQL SELECT根据添加的深度id和日期交替行



我需要为每个部门选择最近的记录,然后是第二最近的记录,然后是第三最近的记录,等等。每个部门可以有任意数量的日期不同的记录,因此没有相关性。我用的是SQL Server。

TABLE PROD (
   PRODNAME VARCHAR(50),
   DEPTID INT,
   ADDED DATEIME
)

我需要结果看起来像这样:

PRODNAME    DEPTID  ADDED
------------------------------
Q           1       2014-08-05 <-- DEPT 1, 1ST MOST RECENT
X           2       2014-08-05 <-- DEPT 2, 1ST MOST RECENT
W           3       2013-05-23 <-- DEPT 3, 1ST MOST RECENT
P           1       2014-07-12 <-- DEPT 1, 2ND MOST RECENT
A           2       2013-09-10 <-- DEPT 2, 2ND MOST RECENT
K           3       2013-01-12 <-- DEPT 3, 2ND MOST RECENT
L           1       2014-07-05 <-- DEPT 1, 3RD MOST RECENT
(NO MORE DEPT 2 RECORDS AVAILABLE, SO GO TO NEXT DEPT)
G           3       2012-12-18 <-- DEPT 3, 3RD MOST RECENT

您可以使用ROW_NUMBER()函数:

;WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY DeptID ORDER BY Added DESC) RN
              FROM Table1)
SELECT Prodname, DeptID, Added
FROM cte
ORDER BY RN, DeptID

演示:SQL Fiddle

ROW_NUMBER()函数为每行分配一个数字。PARTITION BY是可选的,但用于为该组中的每个值开始编号,即:如果您使用PARTITION BY DeptID,那么对于每个唯一的DeptID值,编号将从1开始。ORDER BY当然用于定义计数应该如何进行,并且在ROW_NUMBER()函数中是必需的。

如果在上面的查询中使用SELECT *,您可以了解ROW_NUMBER()函数是如何工作的。

编辑:更新SQL提琴的例子缺少deptid

最新更新