从 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 等
我在维护数据库时遇到问题。我们有一个 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 等