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
相比的用途,请参阅以下参考资料:
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