对于使用字段 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/