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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:42:48