Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何对超过5分钟间隔的T-SQL记录进行排序_Sql Server_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql server 如何对超过5分钟间隔的T-SQL记录进行排序

Sql server 如何对超过5分钟间隔的T-SQL记录进行排序,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,我有以下数据集: Henry 2014-10-24 00:02:28.000 1.00 Henry 2014-10-24 00:07:28.000 2.00 Henry 2014-10-24 00:12:28.000 1.00 Henry 2014-10-24 00:17:28.000 1.00 Henry 2014-10-24 00:22:28.000 4.00 Henry 2014-10-24 00:27:28.000 1.00 Henry 2014-10-24

我有以下数据集:

Henry   2014-10-24 00:02:28.000 1.00
Henry   2014-10-24 00:07:28.000 2.00
Henry   2014-10-24 00:12:28.000 1.00
Henry   2014-10-24 00:17:28.000 1.00
Henry   2014-10-24 00:22:28.000 4.00
Henry   2014-10-24 00:27:28.000 1.00
Henry   2014-10-24 01:44:28.000 2.00
Henry   2014-10-24 01:49:28.000 1.00
Henry   2014-10-24 01:54:28.000 1.00
第1排到第6排的间隔为5分钟,第7排到第9排的间隔为1小时。这可能会有所不同,我想做的是检测数据集何时打破5分钟的间隔。我在看密集排列和行数,但不确定这是否是正确的方向

任何帮助都将不胜感激


谢谢。

我不确定您到底需要什么,但我想您可能需要检查该函数,它允许您访问表中的前一行

SELECT 
    name,
    dtime,
    DATEDIFF(MINUTE,LAG(dtime, 1, dtime) OVER (PARTITION BY name ORDER BY dtime), dtime) AS Diff
FROM #gg
此查询将让您以分钟为单位获得每行与其前一行之间的差异,然后您可以将其用作子查询,以确定哪一行具有
Diff>5
,或者检查结果集中是否有任何行具有该差异。适合你的需要

编辑: 另一种方法是使用与
ROW\u NUMBER()
函数组合的方法。这应该在SQL 2008上运行,但我还没有测试它(它在2012年运行)


由于您没有指定表名或列名,因此我将假设您有一个带有以下模式的表
Times

Name varchar(50)
RecordDate datetime
Amount decimal(8,6)
有了这些知识,您可以使用
交叉应用
(类似于
内部联接
)或
外部应用
(类似于
左联接
)将表与自身进行比较,同时包括一些巧妙的筛选条件:

SELECT *, DATEDIFF(minute, t2.PreviousRecordDate, t1.RecordDate) [Interval]
FROM Times t1
    CROSS APPLY  (
        SELECT TOP 1 RecordDate [PreviousRecordDate]
        FROM Times temp_times
        WHERE temp_times.Name = t1.Name
        AND temp_times.RecordDate < t1.RecordDate
        ORDER BY temp_times.RecordDate DESC
    )  t2
WHERE DATEDIFF(minute, t2.PreviousRecordDate, t1.RecordDate) > 5
从那里,您可以修改查询以使用任何窗口函数或您想要的其他信息

下面是一个实际的例子:

如果您不熟悉
APPLY
及其与常规
JOIN
相比的用途,请参阅以下参考资料:


您使用的是哪一版本的SQL Server碰巧是--2012?是否有主键和/或标识列?数据集的定义是什么?数据集中的所有“亨利”记录是否与所有“萨利”记录相关?表中的列名是什么?将数据分为两组,并执行左连接基集和相关子查询,似乎也可以。然而,使用滞后和超前的窗口分区可能是最有效的。数据集的开始和结束是什么?那么你如何计算他们之间的时间跨度呢?您是查看最后一条记录还是最后一个数据集的第一条?根据您提供的关于滞后函数的链接,SQL Server 2008 R2可能无法使用滞后函数。对于这个版本,它们是可行的解决方案吗?我尝试了你的建议,发现它在应用到我的真实数据集时非常慢。交叉应用解决方案的工作速度要快得多。但是我非常感谢你的建议。
SELECT *, DATEDIFF(minute, t2.PreviousRecordDate, t1.RecordDate) [Interval]
FROM Times t1
    CROSS APPLY  (
        SELECT TOP 1 RecordDate [PreviousRecordDate]
        FROM Times temp_times
        WHERE temp_times.Name = t1.Name
        AND temp_times.RecordDate < t1.RecordDate
        ORDER BY temp_times.RecordDate DESC
    )  t2
WHERE DATEDIFF(minute, t2.PreviousRecordDate, t1.RecordDate) > 5