You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;

语句说明

  1. 内层子查询:
    • COUNT(*) OVER (PARTITION BY patientID):按patientID分组,一次性为每行计算出对应患者的总订单数。
    • ROW_NUMBER() OVER (PARTITION BY patientID ORDER BY orderID):为每个患者的订单按orderID排序并标记行号,首行的行号为1。(可根据实际需求调整排序字段,比如orderDesc)
  2. 外层查询:
    • 通过CASE判断,仅当行号为1时显示总订单数,其余行返回NULL。

性能优化建议

为进一步提升查询效率,可创建覆盖索引,让SQL Server直接从索引获取所需字段,无需回表:

CREATE NONCLUSTERED INDEX IX_myTable_patientID ON myTable (patientID, orderID)
INCLUDE (orderDesc);

关于NULLIF的说明

若用NULLIF配合子查询实现,通常需要多次关联表(先查患者总订单数,再关联原表判断首行),会增加表的访问次数,性能远不如窗口函数方案。

内容的提问来源于stack exchange,提问作者ShroudedSpaceWhale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:57:34