找到与最常出现的值相关联的id之一

时间:2013-12-24 09:07:38

标签: sql sql-server sql-server-2012 greatest-n-per-group

我不是一个流利的英语发言人,所以很难解释我的意思。 我有一个表,列出每个团队每年的一个值(nvarchar)。 现在我需要每年发现一个具有该值最多出现的团队。请看下面的例子:

表格如下:

yearmonth (int) | team_id (int) | value (nvarchar)
201301 | 10 | 4325
201301 | 9  | 4325
201301 | 12 | 8325
201301 | 25 | 4325
201302 | 25 | 8345
201302 | 10 | 2544
201302 | 35 | 2544
201305 | 10 | 3689
201305 | 7  | 8654
201305 | 8  | 8654

我现在需要的是:

yearmonth | team_id
201301 | 9
201302 | 10
201305 | 7

201301 = 9 (or 10 or 25 because 4325 occurs most often, I don't care which team I get
201302 = 10 (or 35) because 2544 occurs  most often, I don't care which team I get)
201305 = 7 (or 8) because 8654 occurs  most often, I don't care which team I get

我一直在关注rank(),dense_rank(),不同的分组和排序选项,但它们都帮助我找到最常出现的。我需要找到一个 teamid ,它与最多发生的价值一起......这就是我迷路的地方...... 不知怎的,我的直觉告诉我它不应该那么难,但我已经在这个问题上坚持了三天:s

1 个答案:

答案 0 :(得分:1)

您可以ROW_NUMBER使用COUNT排序,以获得每组最大n个查询。

WITH t
     AS (SELECT yearmonth,
                value,
                min(team_id) AS team_id,
                ROW_NUMBER() OVER (PARTITION BY yearmonth 
                                      ORDER BY COUNT(*) DESC) AS RN
         FROM   YourTable
         GROUP  BY yearmonth,
                   value)
SELECT yearmonth,
       team_id
FROM   T
WHERE  RN = 1 

SQL Fiddle