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

如何针对单个用户展示排名?附现有SQL查询语句

针对单个用户展示排名的解决方案

嗨,你已经搞定了全量用户的排名展示,现在想单独获取某个用户的排名对吧?这其实很容易,核心思路是先计算所有用户的排名,再筛选出目标用户——千万别直接在原查询里加WHERE再算排名,那样窗口函数只会基于过滤后的单条数据计算,结果永远是1,完全不符合需求。

下面是两种可行的实现方式,我基于你提供的SQL语句补全了可能缺失的部分(比如未写完的nd和trgt关联):

方法1:使用子查询包裹原排名查询

SELECT *
FROM (
    SELECT 
        DENSE_RANK() OVER (ORDER BY s.rows DESC) AS Ranks, 
        Territory, 
        TM_Name, 
        COALESCE(g.rows, 0) AS RXCount, 
        COALESCE(s.rows, 0) AS DelCounts, 
        COALESCE(nd.rows, 0) AS NotDeliveredCount, 
        COALESCE(trgt.rows, 0) AS Target, 
        e.TM_Emp_Id 
    FROM tblEmployee e 
    LEFT JOIN (SELECT EmpCode, SUM(RxGenerate) AS rows FROM tbl_RX GROUP BY EmpCode) g ON g.EmpCode = e.TM_Emp_Id 
    LEFT JOIN (SELECT EmpCode, SUM(MedToPCount) AS rows FROM tbl_MedicinToPatient WHERE Status = 'Delivered' GROUP BY EmpCode) s ON s.EmpCode = e.TM_Emp_Id
    -- 补全未写完的未交付和目标数据关联
    LEFT JOIN (SELECT EmpCode, SUM(MedToPCount) AS rows FROM tbl_MedicinToPatient WHERE Status = 'Not Delivered' GROUP BY EmpCode) nd ON nd.EmpCode = e.TM_Emp_Id
    LEFT JOIN (SELECT EmpCode, SUM(TargetValue) AS rows FROM tbl_Target GROUP BY EmpCode) trgt ON trgt.EmpCode = e.TM_Emp_Id
) AS RankedUsers
-- 这里替换成你要查询的用户标识,可以用ID或姓名
WHERE TM_Emp_Id = '目标用户的EmpID' 
-- 或者用姓名筛选:WHERE TM_Name = '目标用户姓名'

方法2:使用CTE(公共表表达式),可读性更强

CTE的写法和子查询逻辑完全一致,但结构更清晰,适合复杂查询:

WITH RankedUsers AS (
    SELECT 
        DENSE_RANK() OVER (ORDER BY s.rows DESC) AS Ranks, 
        Territory, 
        TM_Name, 
        COALESCE(g.rows, 0) AS RXCount, 
        COALESCE(s.rows, 0) AS DelCounts, 
        COALESCE(nd.rows, 0) AS NotDeliveredCount, 
        COALESCE(trgt.rows, 0) AS Target, 
        e.TM_Emp_Id 
    FROM tblEmployee e 
    LEFT JOIN (SELECT EmpCode, SUM(RxGenerate) AS rows FROM tbl_RX GROUP BY EmpCode) g ON g.EmpCode = e.TM_Emp_Id 
    LEFT JOIN (SELECT EmpCode, SUM(MedToPCount) AS rows FROM tbl_MedicinToPatient WHERE Status = 'Delivered' GROUP BY EmpCode) s ON s.EmpCode = e.TM_Emp_Id
    LEFT JOIN (SELECT EmpCode, SUM(MedToPCount) AS rows FROM tbl_MedicinToPatient WHERE Status = 'Not Delivered' GROUP BY EmpCode) nd ON nd.EmpCode = e.TM_Emp_Id
    LEFT JOIN (SELECT EmpCode, SUM(TargetValue) AS rows FROM tbl_Target GROUP BY EmpCode) trgt ON trgt.EmpCode = e.TM_Emp_Id
)
SELECT *
FROM RankedUsers
WHERE TM_Emp_Id = '目标用户的EmpID';

关键提醒

  • 一定要先计算全量用户的排名,再做筛选,这样得到的Ranks才是该用户在所有用户中的真实排名。
  • 如果你的原查询中还有其他未写完的关联条件,直接补充到子查询/CTE里即可,不影响外层的筛选逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:27:34