SQL - Select 每个值的前 n 次出现
SQL - Select first n occurrences of each value
假设我有一个像这样的 table,只有数千条记录。
| 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 次出现,等等
您可以尝试使用 ROWNUMBER() with 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
您可以在 Bar:
上使用 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
假设我有一个像这样的 table,只有数千条记录。
| 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 次出现,等等
您可以尝试使用 ROWNUMBER() with 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
您可以在 Bar:
上使用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