T-SQL分组查询:按职位选取最长名称的实现问题
解决SQL Server 2012按职位分组取最长名字的问题
嘿,我来帮你搞定这个分组取最长myname的需求!在SQL Server 2012里,我们有几种简单可靠的方法来实现,下面给你详细说明:
方法一:使用窗口函数(推荐)
SQL Server 2012开始支持窗口函数,用ROW_NUMBER()或者DENSE_RANK()可以轻松实现分组筛选,逻辑更清晰:
场景1:每个职位只返回一条最长名字(长度相同时取字典序靠前的)
WITH RankedNames AS ( SELECT position, myname, -- 按职位分组,按名字长度倒序,长度相同则按名字字典序排序 ROW_NUMBER() OVER (PARTITION BY position ORDER BY LEN(myname) DESC, myname) AS rn FROM YourTableName -- 替换成你的实际表名 ) SELECT position, myname AS LongestName FROM RankedNames WHERE rn = 1;
场景2:返回所有长度最长的名字(如果同一职位有多个长度相同的最长名字)
如果需要保留所有长度达标的记录,把ROW_NUMBER()换成DENSE_RANK()即可:
WITH RankedNames AS ( SELECT position, myname, DENSE_RANK() OVER (PARTITION BY position ORDER BY LEN(myname) DESC) AS rn FROM YourTableName ) SELECT position, myname AS LongestName FROM RankedNames WHERE rn = 1;
方法二:聚合子查询关联
如果你更习惯传统的子查询写法,也可以先统计每个职位的名字最大长度,再关联原表匹配对应记录:
SELECT t.position, t.myname AS LongestName FROM YourTableName t INNER JOIN ( -- 先算出每个职位对应的名字最大长度 SELECT position, MAX(LEN(myname)) AS MaxNameLength FROM YourTableName GROUP BY position ) m ON t.position = m.position AND LEN(t.myname) = m.MaxNameLength;
注意:这种方法如果同一职位有多个长度相同的最长名字,会返回所有符合条件的记录。
内容的提问来源于stack exchange,提问作者jorge_vicente
相关产品推荐
相关产品推荐

