Gra*_*lly 0 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
Run Code Online (Sandbox Code Playgroud)
它会给我A和B中行的ID,而这个数字只是为了帮助我看看发生了什么(如果有10个匹配的行,那么它将是10,如果是9,则为9).
我真的不知道接下来要去哪里.我在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
Run Code Online (Sandbox Code Playgroud)
我想要的是这个:
A | B | number
---------
1 | 2 | 7
1 | 1 | 7
Run Code Online (Sandbox Code Playgroud)
所以我真正的问题是 - 如何在A中的每一行中过滤掉 B中的最后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
Run Code Online (Sandbox Code Playgroud)
注意:ROW_NUMBER() OVER(PARTITION b.A ORDER BY B.id DESC)将按b.A降序开始从1开始编号行=>最后一行将具有RowNum= 1,最后一行将具有RowNum= 2,等等.
| 归档时间: |
|
| 查看次数: |
411 次 |
| 最近记录: |