sql - 仅获取当前行与下一行之间的时间差小于 5 分钟的行

标签 sql sql-server tsql sql-server-2012

TSQL 查询 Accounts with Different Times of transaction done

我需要帮助找出一种方法来仅提取当前行和下一行之间的 txn_time 差异小于 5 分钟的记录。 txn_time 已排序。

查看附图,应该只显示第 1、2、3、6、7、8 行,因为每一行之间的时间差都在 5 分钟以内。

任何想法都会有所帮助。

示例数据:

rowno   txn_Date_Time   txn_time    accountNo
1   2017-10-31  11:50:47.0000000    98989898
2   2017-10-31  11:52:23.0000000    98989898
3   2017-10-31  11:52:23.0000000    98989898
4   2017-10-31  11:59:03.0000000    98989898
5   2017-10-31  12:05:13.0000000    98989898
6   2017-10-31  12:41:06.0000000    98989898
7   2017-10-31  12:42:44.0000000    98989898
8   2017-10-31  12:44:02.0000000    98989898
9   2017-10-31  15:23:19.0000000    98989898
10  2017-10-31  16:19:17.0000000    98989898

最佳答案

在 SQL Server 2012+ 中,使用 LEADLAG 函数比使用自连接更有效。

WITH
CTE
AS
(
    SELECT
        rowno
        ,txn_Date_Time
        ,txn_time
        ,accountNo
        ,LEAD(txn_time) OVER (PARTITION BY accountNo ORDER BY txn_time, rowno) AS next_time
        ,LAG(txn_time) OVER (PARTITION BY accountNo ORDER BY txn_time, rowno) AS prev_time
    FROM T
)
SELECT
    rowno
    ,txn_Date_Time
    ,txn_time
    ,accountNo
FROM CTE
WHERE
    DATEDIFF(second, prev_time, txn_time) < 5 * 60
    OR
    DATEDIFF(second, txn_time, next_time) < 5 * 60
ORDER BY txn_time, rowno;

关于sql - 仅获取当前行与下一行之间的时间差小于 5 分钟的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47169295/

相关文章:

sql - 比较三个变量

java - 如何向 View 添加主键?

mysql - 查询多个表?

c# - 将巨大的 xml 参数传递给存储过程的最佳方法

mysql - Order By 不使用 Top MS SQL 查询

sql - 从 Analysis Services 获取实例名称,如 @@ServerName

SQL - 使用字母数字字符排序

sql - 为什么Oracle中不推荐直接引用物化 View ?

mysql - 我没有被告知如何运行,如何找出存储过程的参数

sql - 两列分组在另一列上的区别