我们说我有一张这样的桌子,只有数千条记录。
| 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次等
答案 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