SQL SELECT基于dept id和添加的日期交替行

时间:2014-08-05 22:39:17

标签: sql sql-server

我需要选择每个部门的最新记录,然后是最近的记录,然后是第3个等等。每个部门可以有任意数量的日期不同的记录,因此没有相关性。我使用的是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

1 个答案:

答案 0 :(得分:3)

您可以使用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开始。{ {1}}当然用于定义计数应该如何进行,并且在ORDER BY函数中是必需的。

如果您在上面的查询中ROW_NUMBER(),则可以了解SELECT *函数的工作原理。

编辑:更新了SQL小提琴,其中包含缺少deptid的示例