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
随意打破关系.因此,例如,如果COUNT
是0
针对所有行,则返回的第一个组应该是随机的.我在下面的两个答案中加入NEWID()
了这个尝试ORDER BY
,但没有运气.
谢谢.
; 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)
编辑:
要在关联的情况下随机化,您可以使用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)
归档时间: |
|
查看次数: |
644 次 |
最近记录: |