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

DENSE_RANK函数未按预期工作,求SQL查询解决方案

问题分析与解决方案

问题根源

你的查询中DENSE_RANK() OVER(ORDER BY mu.MacAddress)是按Mac地址的字符串字典序排名,而非你需要的「MacAddress重复次数」,这是导致排名不符合预期的核心原因。此外,当前的GROUP BY逻辑是将同一Mac地址按用户拆分分组,统计的是每个用户对应该Mac地址的记录数,而非该Mac地址的总重复次数——如果你的需求是统计Mac地址的全局重复次数,这部分也需要调整。

解决方案

根据你的实际需求,提供两种针对性方案:

方案1:按Mac地址的全局重复次数排名

如果需要统计每个MacAddress在整张表中的总重复次数,并以此排名,先通过子查询/CTE计算Mac地址的总次数,再关联其他表获取用户信息:

WITH MacTotalCounts AS (
    SELECT 
        MacAddress,
        COUNT(*) AS TotalQuantity
    FROM MacsUsers
    GROUP BY MacAddress
)
SELECT
    MTC.TotalQuantity AS Quantity,
    U.Name,
    U.SurName,
    MU.MacAddress,
    DENSE_RANK() OVER(ORDER BY MTC.TotalQuantity DESC) AS RNK
FROM MacsUsers MU
JOIN Macs MAC ON MAC.MacAddress = MU.MacAddress
JOIN Users U ON MAC.UserEmail = U.Email
JOIN Profiles PROFILE ON PROFILE.MacAddress = MAC.MacAddress
JOIN MacTotalCounts MTC ON MTC.MacAddress = MU.MacAddress
GROUP BY MTC.TotalQuantity, U.Name, U.SurName, MU.MacAddress
ORDER BY RNK

方案2:按用户对应Mac地址的重复次数排名

如果你的需求是统计每个用户使用某Mac地址的次数,并以此排名,只需修改DENSE_RANK的排序字段为聚合后的Quantity(并按降序排列,让次数多的排在前面):

SELECT
    COUNT(MU.MacAddress) AS Quantity,
    [USER].Name,
    [USER].SurName,
    MU.MacAddress,
    DENSE_RANK() OVER(ORDER BY COUNT(MU.MacAddress) DESC) AS RNK
FROM MacsUsers [MU]
JOIN Macs [MAC] ON [MAC].MacAddress = [MU].MacAddress
JOIN Users [USER] ON [MAC].UserEmail = [USER].Email
JOIN Profiles [PROFILE] ON [PROFILE].MacAddress = [MAC].MacAddress
GROUP BY MU.MacAddress, [USER].Name, [USER].SurName
ORDER BY RNK

关键说明

  • DENSE_RANK()的排序字段必须是你用来排名的核心指标(即重复次数),而非Mac地址本身;
  • 添加DESC可以让重复次数多的记录排名更靠前,符合常规的排名需求;
  • 方案1的CTE确保了Mac地址的重复次数是全局统计的,不会被用户维度拆分。

内容的提问来源于stack exchange,提问作者Andres Guillen Hernandez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:20:44