gpt4 book ai didi

sql - 为表中的每个组选择前 N 行

转载 作者:行者123 更新时间:2023-12-03 23:38:07 26 4
gpt4 key购买 nike

我面临一个关于“为表中的每个组选择前 N 行”的非常常见的问题。

考虑一个带有 id, name, hair_colour, score 的表列。

我想要一个结果集,对于每种头发颜色,让我获得前 3 名得分手的名字。

为了解决这个问题,我在 Rick Osborne's blogpost "sql-getting-top-n-rows-for-a-grouped-query" 上得到了我需要的东西

当我的分数相等时,该解决方案无法按预期工作。

在上面的例子中,结果如下。

 id  name  hair  score  ranknum
---------------------------------
12 Kit Blonde 10 1
9 Becca Blonde 9 2
8 Katie Blonde 8 3
3 Sarah Brunette 10 1
4 Deborah Brunette 9 2 - ------- - - > if
1 Kim Brunette 8 3

考虑行 4 Deborah Brunette 9 2 .如果这也有与莎拉相同的分数 (10),那么“黑发”类型的头发的等级将是 2,2,3。

解决这个问题的方法是什么?

最佳答案

如果您使用的是 SQL Server 2005 或更新版本,您可以使用排名函数和 CTE 来实现这一点:

;WITH HairColors AS
(SELECT id, name, hair, score,
ROW_NUMBER() OVER(PARTITION BY hair ORDER BY score DESC) as 'RowNum'
)
SELECT id, name, hair, score
FROM HairColors
WHERE RowNum <= 3

此 CTE 将按 hair 的值对您的数据进行“分区”。列,然后每个分区按分数(降序)排序并获得行号;每个分区的最高分是 1,然后是 2,以此类推。

因此,如果您想获得每组的 TOP 3,请仅从 CTE 中选择具有 RowNum 的那些行。 3 个或更少 (1, 2, 3) --> 你去吧!

关于sql - 为表中的每个组选择前 N 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3998529/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com