sql-server - 如何计算 SQL 中另一列中每个值的众数

标签 sql-server sql-server-2008 tsql 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

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

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)

如果是平局,我需要为每个平局组返回一条记录。

如何在 TSQL 中优雅地完成此操作?我认为我需要使用窗口函数,但我一直在努力解决如何实现它。

最佳答案

这是我的无 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

SQL Fiddle 演示:No tiesWith ties

更新:(见评论)

关于sql-server - 如何计算 SQL 中另一列中每个值的众数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13061336/

相关文章:

c# - sql server 24/7 插入删除选择性能

sql-server - T-SQL 事务语法

sql - 在不知道字符串长度的情况下删除额外的逗号

sql - 如何在单个 SELECT 语句中拥有多个公用表表达式?

SQL Azure : Executing SQL directly; no cursor

sql - 如何在 SQL Server 中转义单引号?

sql-server - 帮助我形成一个sql查询

sql - 如果表中存在列,则重命名该列

简单联合的情况下的SQL查询性能

sql - 在 WHERE 子句中重用计算列