如何用T-SQL高效获取每个姓名对应的最频繁出现地点?
简化T-SQL实现:获取每个用户出现次数最多的地点
针对你需求的场景(忽略Date字段,获取每个Name对应出现次数最多的Location),可以用窗口函数实现更简洁的写法,避免多层嵌套的复杂结构,以下是几种常用方案:
方案1:使用ROW_NUMBER()窗口函数(推荐)
这是最直观且易维护的写法,先统计每个Name-Location的出现次数,再通过窗口函数给每个分组内的记录按次数排序,取排名第一的结果:
WITH LocationStats AS ( SELECT Name, Location, COUNT(*) AS Occurrence, -- 按Name分组,按出现次数降序编号,次数相同则随机取一个 ROW_NUMBER() OVER (PARTITION BY Name ORDER BY COUNT(*) DESC) AS RankNum FROM YourTable -- 注意替换成你的实际表名 GROUP BY Name, Location ) SELECT Name, Location FROM LocationStats WHERE RankNum = 1;
如果存在多个Location出现次数并列最多的情况,想要保留所有并列结果,可以把ROW_NUMBER()换成RANK()或DENSE_RANK()。
方案2:TOP 1 WITH TIES 简化写法
利用TOP 1 WITH TIES特性,配合窗口函数直接返回所有分组的Top1结果:
SELECT TOP 1 WITH TIES Name, Location FROM ( SELECT Name, Location, COUNT(*) AS Occurrence FROM YourTable GROUP BY Name, Location ) AS GroupedStats ORDER BY ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Occurrence DESC);
方案3:使用APPLY子查询
适合习惯子查询写法的场景,通过关联子查询直接获取每个Name对应的最高频Location:
SELECT DISTINCT t.Name, LocationStats.Location FROM YourTable t CROSS APPLY ( SELECT TOP 1 Location FROM YourTable WHERE Name = t.Name GROUP BY Location ORDER BY COUNT(*) DESC ) AS LocationStats;
对比原语句的优势
原语句存在多层嵌套、分组逻辑冗余(甚至有语法错误:group by Table.Name, Table.Name应为group by Table.Name, Table.Location),上述方案均通过窗口函数或关联子查询简化了逻辑,可读性和维护性更强,执行效率也更优。
内容的提问来源于stack exchange,提问作者rhs
相关产品推荐
相关产品推荐

