如何计算TSQL中另一列中每个值的模式

Mik*_*ain 2 t-sql sql-server sql-server-2008 window-functions

我有这样一张桌子:

ID   Group  Gender
------------------
1    A      M
2    A      M
3    A      F
4    A      M
5    A      U
6    B      F
7    B      F
8    B      M
9    C      U
10   C      F
11   C      U
Run Code Online (Sandbox Code Playgroud)

我正在尝试计算每个性别的模式组.换句话说,对于每个性别,请告诉我哪个是最受欢迎的群体.所以我想要的结果如下:

Gender  ModeGroup
-----------------
M       A          (because 3 males in group A, 1 in B and 0 in C)
F       B          (because 2 females in group B, 1 in A and 1 in C)
U       C          (because 2 unknown in group C, 0 in B and 1 in C)
Run Code Online (Sandbox Code Playgroud)

在平局的情况下,我需要为每个绑定组返回一条记录.

如何在TSQL中优雅地完成这项工作?我想我需要使用一个窗口函数,但我一直在努力解决它.

Jet*_*ett 5

这是我的No-CTE解决方案:

SELECT
  Gender,
  [Group]
FROM
  (
    SELECT
      [Group],
      Gender,
      RANK() OVER(PARTITION BY Gender ORDER BY [Count] DESC) AS [Rank]
    FROM
      (
        SELECT [Group], Gender, SUM(1) AS [Count]
        FROM GroupGender
        GROUP BY [Group], Gender
      ) AS counts
  ) AS ranks
WHERE
  [Rank] = 1
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle演示:没有联系有关系

更新:(见评论)