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

时间:2015-06-01 20:37:20

标签: sql sql-server tsql 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  | 
...

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

SELECT Foo
FROM tableName
WHERE Bar LIKE 'B%'

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

您可以尝试将ROWNUMBER()PARTION BY

一起使用
SELECT Foo, Bar
FROM 
   (
     SELECT
         Foo,
         Bar,
         ROW_NUMBER() OVER (PARTITION BY BAR ORDER BY FOO) AS RowCount
     FROM
        tableName
    ) AS data
WHERE 
    data.RowCount <= 100