选择前N行,再根据之前的结果选择另一个

时间:2019-12-05 13:15:41

标签: sql sql-server

我对SQL还是很陌生。

我有一个MS SQL DB,我想在其中获取日期时间在特定输入上方的前3行,再加上所有datetime值等于上一次获取的最后一行的行。

| rowId | Timestamp                | data |
|-------|--------------------------|------|
| rsg   | 2019-01-01T00:00:00.000Z | 120  |
| zqd   | 2020-01-01T00:00:00.000Z | 36   |
| ylp   | 2020-01-01T00:00:00.000Z | 48   |
| abt   | 2022-01-01T00:00:00.000Z | 53   |
| zio   | 2022-01-01T00:00:00.000Z | 12   |

这是我当前的请求,要提取3行。

    SELECT
      TOP 3 *
    FROM
      Table
    WHERE
      Timestamp >= '2020-01-01T00:00:00.000Z'
    ORDER BY
      Timestamp ASC

在这里,我想在一个请求中获得最后4行。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

一种可能性,使用ROW_NUMBER

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY Timestamp) rn
    FROM yourTable
)

SELECT *
FROM cte
WHERE
    Timestamp <= (SELECT Timestamp FROM cte WHERE rn = 3);

匹配记录应该在前3行中,或者应该具有与第三行中的时间戳相等的时间戳。我们可以通过将时间戳限制为等于或小于第三行中的时间戳来组合这些条件。

或者可以使用TOP 3 WITH TIES

SELECT TOP 3 WITH TIES *
FROM yourTable
ORDER BY Timestamp;