【问题标题】:picking up records from a SQL query result based on rank根据排名从 SQL 查询结果中提取记录
【发布时间】:2017-07-02 01:32:28
【问题描述】:

我正在测试一个复杂的数据库规则,我需要帮助来制定逻辑来测试以下场景。

我有一个如下的输出,比如说表名 temp

BUSINESS_KEY     STATUS_KEY   CREATE_TIMESTAMP
123               a1          1 P.M.
123               a1          1:30 P.M.
123               b1          2:00 P.M.
123               a1          2:30 P.M.

我必须从上面的记录中提取下面的记录

BUSINESS_KEY     STATUS_KEY   CREATE_TIMESTAMP
123               a1          1 P.M.
123               b1          2:00 P.M.
123               a1          2:30 P.M.

我必须丢弃第二条记录,规则是如果相同的 status_key 出现在连续时间戳的输出中,就像上面的示例中下午 1:00 一样。和下午 1:30,只拾取最早的时间戳记录。我可以选择第四条记录,因为它与第一条不连续。

我尝试了所有 rank()、row_number、self join 组合,但没有奏效。有人可以帮忙吗?

【问题讨论】:

  • 我刚刚使用LAGROW_NUMBER() 回答了类似的问题here。我建议将该 TIMESTAMP 存储为 DATETIME ......因为跨天订购数据会让您有些头疼。如果时间是 11:50,然后是 00:01?

标签: sql-server rank row-number


【解决方案1】:

一种方法使用lag(),另一种使用row_number()的差异。后者适用于 SQL Server 2012 之前的版本。使用 lag() 这很容易:

select t.*
from (select t.*,
             lag(status_key) over (partition by business_key order by create_timestamp) as prev_status_key
      from t
     ) t
where prev_status_key is null or prev_status_key <> status_key;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多