如何在给定记录之前和之后获得记录?

Rod*_*Rod 16 sql t-sql sql-server

我有以下表结构:

Id, Message
1, John Doe
2, Jane Smith
3, Error
4, Jane Smith
Run Code Online (Sandbox Code Playgroud)

有没有办法获取错误记录和周围的记录?即查找所有错误以及它们之前和之后的记录.

Mar*_*ith 13

;WITH numberedlogtable AS
(
SELECT Id,Message, 
ROW_NUMBER() OVER (ORDER BY ID) AS RN
 FROM logtable
)

SELECT Id,Message
FROM numberedlogtable
WHERE RN IN (SELECT RN+i
             FROM numberedlogtable
             CROSS JOIN (SELECT -1 AS i UNION ALL SELECT 0 UNION ALL SELECT 1) n
             WHERE Message='Error')
Run Code Online (Sandbox Code Playgroud)

  • 因为我们不知道你的id序列是否有空位我用'ROW_NUMBER()`来得到一个没有间隙的保证序列.此查询将放入公用表表达式并使用两次.一旦找到有错误的行号.然后将其交叉连接到小表上,因此对于找到的每个行号,我们得到3个行号(前一个,目标和下一个).一旦确定了感兴趣的行号,该行号被插回到原始查询中以检索相应的记录. (2认同)

Qua*_*noi 6

WITH    err AS 
        (
        SELECT  TOP 1 *
        FROM    log
        WHERE   message = 'Error'
        ORDER BY
                id
        ),
        p AS
        (
        SELECT  TOP 1 l.*
        FROM    log
        WHERE   id <
                (
                SELECT  id
                FROM    err
                )
        ORDER BY
                id DESC
        )
SELECT  TOP 3 *
FROM    log
WHERE   id >
        (
        SELECT  id
        FROM    p
        )
ORDER BY
        id
Run Code Online (Sandbox Code Playgroud)