【问题标题】:Select Top N rows plus another Select based on previous result选择前 N 行加上另一个基于先前结果的选择
【发布时间】:2019-12-06 19:22:12
【问题描述】:

我对 SQL 很陌生。

我有一个 MS SQL 数据库,我想在其中获取日期时间高于特定输入的前 3 行,并获取日期时间值等于上一次获取的最后一行的所有行。

| 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 行。

感谢您的帮助

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    一种可能性,使用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;
    

    【讨论】:

    • 为什么不只排在前三名?
    • @SMor 因为我们只想要来自具有第三小的时间戳的记录的关系。第一个和第二个记录,我们只取一个,无论是否平局。
    • 但 top with ties 会“返回两个或更多行并列最后一个位置”。 fiddle
    • "ties" 正是我所需要的。蒂姆的回答很好,但请求在我的数据库上花费了太多时间。非常感谢@SMor
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多