如何在给出之前获得N条记录?

Bra*_*ans 9 sql sql-server

如何在给出之前获得N条记录?

我有以下表结构:

Id, Message
1, John Doe
2, Jane Smith
3, Error
4, Jane Smith
5, Michael Pirs
7, Gabriel Angelos
8, Error
Run Code Online (Sandbox Code Playgroud)

有没有办法在每个错误之前获取N条记录并加入所有这些记录?因此,N = 2的预期结果将是

1, John Doe
2, Jane Smith
5, Michael Pirs
7, Gabriel Angelos
Run Code Online (Sandbox Code Playgroud)

小提琴

Bri*_*ler 3

如果您的 Id 不能无间隙递增,则需要创建行号列。distinct然后您可以使用简单的连接来查找前一个 N。您的前一个 N 可能会重叠...因此,如果您不想重复,则必须添加。

declare @N as integer
set @N=2

;with cte_tbl (Id, Message, rownum) AS
(
select *, ROW_NUMBER() over (order by id) as rownum from test
)
select distinct Prev.Id, Prev.Message
from cte_tbl
join cte_tbl Prev
on Prev.rownum between cte_tbl.rownum-@N and cte_tbl.rownum-1
where cte_tbl.Message = 'Error'
    and Prev.Message <> 'Error'
order by Prev.Id
Run Code Online (Sandbox Code Playgroud)

如果之前的记录之一@N是错误的,则“错误”记录将不会显示。如果您确实希望包含这些内容,则必须对此进行修改。只需简单地移除该线即可and Prev.Message <> 'Error'