sql-server - 从组内的每列中检索最常见的值

标签 sql-server sql-server-2012

对于使用字段 GRP 分组的每个组,我希望检索 A 列中最常出现的值和 B 列中最常出现的值,并可能对许多其他列执行此操作。

示例数据:

GRP | A | B
-----------
Cat | 1 | 1
Cat | 2 | 1
Cat | 3 | 2
Cat | 3 | 3
Dog | 5 | 6
Dog | 5 | 7
Dog | 6 | 7

预期输出:

GRP | A | B
-----------
Cat | 3 | 1
Dog | 5 | 7

此查询实现了该结果:

SELECT 
    freq1.GRP,
    freq1.A,
    freq2.B
FROM (
        SELECT
            GRP,
            A,
            ROW_NUMBER() OVER(PARTITION BY GRP ORDER BY COUNT(*) DESC) AS F_RANK
        FROM MyTable
        GROUP BY GRP, A
) AS freq1
INNER JOIN (
        SELECT
            GRP,
            B,
            ROW_NUMBER() OVER(PARTITION BY GRP ORDER BY COUNT(*) DESC) AS F_RANK
        FROM MyTable
        GROUP BY GRP, B
) AS freq2 ON freq2.GRP = freq1.GRP
WHERE freq1.F_RANK = 1 AND freq2.F_RANK = 1

它看起来效率不高,如果我添加列 C、D 等,效率就更低了...

有更好的方法吗?

最佳答案

我不会说这种方法“更好”,因为它会生成完全相同的执行计划。然而,我发现随着列数的增加,这种方法更容易维护。对我来说,这更容易阅读。

with GroupA as
(
    select Grp
        , A
        , ROW_NUMBER() over(partition by grp order by count(*) desc) as RowNum
    from MyTable
    group by Grp, A
)
, GroupB as
(
    select Grp
        , B
        , ROW_NUMBER() over(partition by grp order by count(*) desc) as RowNum
    from MyTable
    group by Grp, B
)

select a.Grp
    , a.A
    , b.B
from GroupA a
inner join GroupB b on a.Grp = b.Grp and b.RowNum = 1
where a.RowNum = 1;

关于sql-server - 从组内的每列中检索最常见的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27063284/

相关文章:

asp.net - Oracle中Link DB参数问题

sql - 写入具有两位小数的数字 SQL Server

sqlite - 使用SQL对sqlite使用count(*)的openquery的SQL服务器

visual-studio-2012 - 如何在 sqlproj (SQL Server 2012) 脚本中使用 msbuild 属性

sql-server - SQL Server 比较两个应该相同的查询的结果

sql-server - 如何设置 Azure SQL 自动重建索引?

c# - 在数据库中存储第三方服务登录名/密码

sql - 相关子查询出错。 "MultiPart ID oh.SalesOrderID could not be bound"

sql-server - SQL Server 服务无法启动

sql - 与 SQL Server 中的临时表相比,为什么 CTE(通用表表达式)在某些情况下会减慢查询速度