我在修复数据库时遇到了问题。我们有一个表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中的每一行都是这样的?我甚至不知道我到目前为止是否正朝着正确的方向前进,但这似乎是一个合理的起点。
答案 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