这并不是直接回答问题,但我想解释一下为什么你尝试的方法没有按照你的期望工作。
你的问题是由于PARTITION
引起的。如果你从PARTITION
子句中删除非唯一列,那么你只剩下afdelingscode
。因此,简单来说,你的PARTITION
将数据分组如下:
RD8-GH Endo
RD8-GH MAU
RD8-GH MAU
RD8-GH Ward 08
RD8-GH Ward 08
RD8-GH Ward 08
ORDER BY
子句确定了你的PARTITION
内的顺序,因此再次删除非唯一列,给出ORDER BY OntslagDatumTijd
,这将产生以下结果,其中按日期列排序,注意分区仍由afdelingscode
分隔:
afdelingscode OntslagDatumTijd
RD8-GH Endo 2014-09-09 09:06:00.000
RD8-GH MAU 2014-09-01 14:50:00.000
RD8-GH MAU 2014-09-02 19:32:00.000
RD8-GH Ward 08 2014-09-03 17:12:00.000
RD8-GH Ward 08 2014-09-17 17:00:00.000
RD8-GH Ward 08 2014-10-01 17:15:00.000
排名然后应用于这些分区。其输出如下:
rnk afdelingscode OntslagDatumTijd
1 RD8-GH Endo 2014-09-09 09:06:00.000
1 RD8-GH MAU 2014-09-01 14:50:00.000
2 RD8-GH MAU 2014-09-02 19:32:00.000
1 RD8-GH Ward 08 2014-09-03 17:12:00.000
2 RD8-GH Ward 08 2014-09-17 17:00:00.000
3 RD8-GH Ward 08 2014-10-01 17:15:00.000
所以它是按照您指定的方式进行排名的,您输出的问题在于在选择结束时(删除非唯一列)按日期列 OntslagDatumTijd
进行排序,这样会得到:
rnk afdelingscode OntslagDatumTijd
1 RD8-GH MAU 2014-09-01 14:50:00.000
2 RD8-GH MAU 2014-09-02 19:32:00.000
1 RD8-GH Ward 08 2014-09-03 17:12:00.000
1 RD8-GH Endo 2014-09-09 09:06:00.000
2 RD8-GH Ward 08 2014-09-17 17:00:00.000
3 RD8-GH Ward 08 2014-10-01 17:15:00.000
如果其他回答不符合您的要求,我会继续查看此问题。
参考:
OVER Clause
PARTITION BY 将查询结果集分成分区。窗口函数将分别应用于每个分区,并且每个分区都重新开始计算。
ORDER BY 子句 定义结果集中每个分区内行的逻辑顺序。也就是说,它指定了执行窗口函数计算的逻辑顺序。
这里有一个潜在的解决方案,可能会因为您使用的数据量而出现性能问题,但您可以进行测试:
CREATE TABLE #t_opnames
(
Opnamenummer INT ,
Patient_ID INT ,
afdelingscode NVARCHAR(20) ,
Opnametype NVARCHAR(20) ,
Specialismen NVARCHAR(20) ,
OntslagDatumTijd DATETIME
);
INSERT INTO #t_opnames
( Opnamenummer, Patient_ID, afdelingscode, Opnametype, Specialismen,
OntslagDatumTijd )
VALUES ( 2983800, 100006, 'RD8-GH MAU', 'Inpatient-E', 'GM',
'2014-09-01 14:50:00.000' ),
( 2983800, 100006, 'RD8-GH MAU', 'Inpatient-E', 'GM',
'2014-09-02 19:32:00.000' ),
( 2983800, 100006, 'RD8-GH Ward 08', 'Inpatient-E', 'GM',
'2014-09-03 17:12:00.000' ),
( 2983800, 100006, 'RD8-GH Endo', 'Inpatient-E', 'GM',
'2014-09-09 09:06:00.000' ),
( 2983800, 100006, 'RD8-GH Ward 08', 'Inpatient-E', 'GM',
'2014-09-17 17:00:00.000' ),
( 2983800, 100006, 'RD8-GH Ward 08', 'Inpatient-E', 'GM',
'2014-10-01 17:15:00.000' )
SELECT ROW_NUMBER() OVER ( ORDER BY OntslagDatumTijd ) AS rn ,
*
INTO #temp
FROM #t_opnames
ORDER BY OntslagDatumTijd
;WITH cte AS (
SELECT *, 1 AS rnk
FROM #temp
WHERE rn = 1
UNION ALL
SELECT t.*, CASE WHEN cte.afdelingscode = t.afdelingscode
THEN cte.rnk + 1
ELSE 1
END AS rnk
FROM #temp t
INNER JOIN cte ON cte.rn +1 = t.rn
)
SELECT * FROM cte
DROP TABLE #t_opnames
DROP TABLE #temp
当你处理一个更大的数据集时,你会遇到MAXRECURSION
限制,所以你需要在最后一个SELECT
语句之后使用以下代码修改限制:
SELECT * FROM cte
OPTION (MAXRECURSION 0)
将此值设置为
0
不会强制实施任何限制,如果您事先知道数据集的大小,则可以将此数字设置为数据集的大小。
OVER()
子句中包含的列的示例数据吗? - gotqnSPECIALISMEN
和OntslagDatumTijd
。 - gotqnSQL Server
? - gotqn