我需要选择每个部门的最新记录,然后是最近的记录,然后是第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
答案 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的示例