如何在SQL Server中仅显示每个患者订单计数的首行值?
解决SQL Server中患者订单首行显示总计数的高效方案
可以利用SQL Server的窗口函数实现需求,这种方式仅需扫描一次表,避免多次关联或子查询带来的性能损耗,是高效的实现方式。
具体查询语句
SELECT patientID AS PID, CASE WHEN rn = 1 THEN total_orders ELSE NULL END AS [Count], orderID AS OID, orderDesc FROM ( SELECT patientID, orderID, orderDesc, COUNT(*) OVER (PARTITION BY patientID) AS total_orders, ROW_NUMBER() OVER (PARTITION BY patientID ORDER BY orderID) AS rn FROM myTable ) t ORDER BY patientID, orderID;
语句说明
- 内层子查询:
COUNT(*) OVER (PARTITION BY patientID):按patientID分组,一次性为每行计算出对应患者的总订单数。ROW_NUMBER() OVER (PARTITION BY patientID ORDER BY orderID):为每个患者的订单按orderID排序并标记行号,首行的行号为1。(可根据实际需求调整排序字段,比如orderDesc)
- 外层查询:
- 通过
CASE判断,仅当行号为1时显示总订单数,其余行返回NULL。
- 通过
性能优化建议
为进一步提升查询效率,可创建覆盖索引,让SQL Server直接从索引获取所需字段,无需回表:
CREATE NONCLUSTERED INDEX IX_myTable_patientID ON myTable (patientID, orderID) INCLUDE (orderDesc);
关于NULLIF的说明
若用NULLIF配合子查询实现,通常需要多次关联表(先查患者总订单数,再关联原表判断首行),会增加表的访问次数,性能远不如窗口函数方案。
内容的提问来源于stack exchange,提问作者ShroudedSpaceWhale
相关产品推荐
相关产品推荐

