根据排名从 SQL 查询结果中提取记录
picking up records from a SQL query result based on rank
我正在测试一个复杂的数据库规则,我需要帮助来制定逻辑以测试以下场景。
我的输出如下假设 table name 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 P.M 一样。而1:30 P.M.,只取最早的时间戳记录。我可以选择第四条记录,因为它与第一条记录不连续。
我尝试了所有 rank()、row_number、自连接组合,但没有用。有人可以帮忙吗?
一种方法使用lag()
,另一种方法使用row_number()
的差异。后者适用于 pre-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;
我正在测试一个复杂的数据库规则,我需要帮助来制定逻辑以测试以下场景。
我的输出如下假设 table name 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 P.M 一样。而1:30 P.M.,只取最早的时间戳记录。我可以选择第四条记录,因为它与第一条记录不连续。
我尝试了所有 rank()、row_number、自连接组合,但没有用。有人可以帮忙吗?
一种方法使用lag()
,另一种方法使用row_number()
的差异。后者适用于 pre-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;