从 sql 服务器的连接中选择除最后 X 行以外的所有行

selecting all but the last X rows from a join in sql server

我在维护数据库时遇到问题。我们有一个 table A 和一个 table B 具有一对多关系。现在 table B 中的每一行都有 1 到 10 行,我想查看除了最近的 5 行之外的每一行。如果 A 中的任何行在 B 中的行数不超过 5 行,我不想看到它,因为我不关心该数据。

这是我目前的查询:

WITH cte (id, number)
AS
(
    SELECT A.id, COUNT(*)
    FROM A INNER JOIN B ON A.id=B.a
    GROUP BY A.id
)
SELECT A.id, B.id, number
FROM cte c 
INNER JOIN B ON B.a=c.id
WHERE number > 5
ORDER BY A.id, B.id DESC;
GO

它会给我 A 和 B 中行的 ID,这个数字只是为了帮助我看看发生了什么(如果有 10 个匹配行,它将是 10,如果有 9 个,则为 9,等等) .

我真的不知道下一步该去哪里。我在 A 中有一个行列表,在 B 中有它们的匹配项,我只想看到 A 中每一行在 B 中的最后 5 行。我的数据可能如下所示:

A | B | number
---------
1 | 7 | 7
1 | 6 | 7
1 | 5 | 7
1 | 4 | 7
1 | 3 | 7
1 | 2 | 7
1 | 1 | 7
2 | 9 | 2
2 | 8 | 2

而我想要的是:

A | B | number
---------
1 | 2 | 7
1 | 1 | 7

所以我的问题真的是 - 我怎样才能像这样为 A 中的每一行过滤掉 B 中的最后 5 行?到目前为止,我什至不知道我是否正朝着正确的方向前进,但这似乎是一个合理的起点。

WITH cte (id, number) AS ( SELECT A.id, COUNT(*) FROM A 
INNER JOIN B ON A.id=B.a GROUP BY A.id ) 
SELECT TOP 5 A.id, B.id, number FROM cte c 
INNER JOIN B ON B.a=c.id 
WHERE number > 5 ORDER BY A.id ASC, B.id ASC; GO

试试这个查询:

SELECT *
FROM (
    SELECT ROW_NUMBER() OVER(PARTITION BY b.A ORDER BY b.id DESC) AS RowNum, ... other columns from b ...
    FROM dbo.B as b
) x
WHERE x.RowNum > 5

注意:ROW_NUMBER() OVER(PARTITION b.A ORDER BY B.id DESC) 将从 1 开始对每个 b.A 的行进行降序编号 => 最后一行 RowNum = 1,最后一行 RowNum = 2 等