从sql server中的连接中选择除最后X行之外的所有行

时间:2015-03-06 21:53:51

标签: sql-server sql-server-2012

我在修复数据库时遇到了问题。我们有一个表A和一个具有一对多关系的表B.现在,表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)。 / p>

我真的不知道接下来要去哪里。我在A中有一个行列表,在B中有它们的匹配,我想只看到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

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

2 个答案:

答案 0 :(得分:5)

尝试此查询:

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)将按照每个b.A的降序开始从1开始编号行=>最后一行将RowNum = 1,最后一行将有RowNum = 2等等。

答案 1 :(得分:0)

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