SQL - 选择每个值的前n次出现

Dry*_*ong 1 sql t-sql sql-server sql-server-2005

假设我有一张这样的表,只有数千条记录.

| Foo | Bar  | 
| 1   | A_1  | 
| 1   | A_2  | 
| 2   | B_1  | 
| 3   | B_1  | 
| 3   | B_2  | 
| 3   | B_1  | 
| 4   | B_3  | 
...
Run Code Online (Sandbox Code Playgroud)

当我执行下面的代码时,我显然得到了Bar以B开头的每一条记录.

SELECT Foo
FROM tableName
WHERE Bar LIKE 'B%'
Run Code Online (Sandbox Code Playgroud)

我知道使用GROUP BY会得到每个的前1个记录,但我需要的不仅仅是那个.使用SELECT TOP 100只会记录前100条记录,无论它们是哪个"B",并且因为有超过100个B_1值,所以我将获得所有这些.

我怎样才能获得每个唯一B 的前n条记录?例如,B_1的前100次出现,B_2的前100次出现等.

Siy*_*ual 5

您可以使用ROW_NUMBER一个PARTITION在酒吧:

;With Cte As
(
    Select  Foo, Bar,
            Row_Number() Over (Partition By Bar Order By Foo Asc) As Row_Number
    From    tableName
    Where   Bar Like 'B%'
)
Select  Foo, Bar
From    Cte
Where   Row_Number <= 100
Run Code Online (Sandbox Code Playgroud)