按另一列分组的一列的最低值排序

tpt*_*cat 2 t-sql sql-server group-by sql-order-by ranking

这在标题中很难解释,但这里有一张表:

CATEGORY_ID   COUNT   GROUPING
1             130     H
2              54     B
3             128     C
4              70     D
5              31     E
6              25     F
7              64     A
8              59     F
9              66     B
10             62     E
11            129     C
12             52     G
13             27     A
14            102     A
15            101     C
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个查询来获取TOP 5 CATEGORY_ID's,首先按整体排序COUNT,然后基于该组使用该组中的其他CATEGORY_ID人,而不管他们是谁COUNT.所以,如果我想TOP 5基于这个规则(我可能解释得很差),我的结果将是:

CATEGORY_ID   COUNT   GROUPING
6             25      F <-- THE LOWEST COUNT OVERALL
8             59      F <-- THE NEXT LOWEST IN GROUP 'F'
13            27      A <-- THE NEXT LOWEST OVERALL
7             64      A <-- THE NEXT LOWEST IN GROUP 'A'
14            102     A <-- THE NEXT LOWEST IN GROUP 'A'
Run Code Online (Sandbox Code Playgroud)

我在这里和其他地方看了很多(尝试过像RANK(),DENSE_RANK(),GROUPING SETS等等 - 大多数情况下都是在黑暗中刺伤)并且四处都是撞墙.

编辑:另外一件事是我需要COUNT随意打破关系.因此,例如,如果COUNT0针对所有行,则返回的第一个组应该是随机的.我在下面的两个答案中加入NEWID()了这个尝试ORDER BY,但没有运气.

谢谢.

Mic*_*son 5

; with groups as (
  select
    grouping,
    min(count) as group_min
  from categories
  group by grouping
)
select top 5 c.category_id, c.count, c.grouping
from categories c
join groups g on c.grouping = g.grouping
order by g.group_min, c.count
Run Code Online (Sandbox Code Playgroud)

Sql小提琴

编辑:

要在关联的情况下随机化,您可以使用row_number()和向每个组添加随机顺序newid():

; with groups as (
  select
    grouping,
    row_number() over (order by newid()) as random,
    min(count) as group_min
  from categories
  group by grouping
)
select top 5
  c.category_id, c.count, c.grouping
from categories c
join groups g on c.grouping = g.grouping
order by g.group_min, g.random, c.count
Run Code Online (Sandbox Code Playgroud)

Sql小提琴