Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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/5/google-sheets/3.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 获取记录组之间的时间差_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 获取记录组之间的时间差

Sql 获取记录组之间的时间差,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一张结构如下的桌子 ID ActivityTime Status 19 2013-08-23 14:52 1 19 2013-08-23 14:50 1 19 2013-08-23 14:45 2 19 2013-08-23 14:35 2 19 2013-08-23 14:32

我有一张结构如下的桌子

ID         ActivityTime             Status
19        2013-08-23 14:52            1
19        2013-08-23 14:50            1
19        2013-08-23 14:45            2
19        2013-08-23 14:35            2
19        2013-08-23 14:32            1
19        2013-08-23 14:30            1
19        2013-08-23 14:25            2
19        2013-08-23 14:22            2
53        2013-08-23 14:59            1
53        2013-08-23 14:56            1
53        2013-08-23 14:57            1
53        2013-08-23 14:52            2
53        2013-08-23 14:50            2
53        2013-08-23 14:49            2
53        2013-08-23 14:18            2
53        2013-08-23 14:30            1
我想根据状态2计算每个ID的总时差。例如,ID 19从14:35到14:50(15分钟),然后从14:22到14:30(8分钟),一直处于状态2。因此,在状态2上停留的总ID 19是23分钟(在这两种情况下,我都考虑了状态2到状态1的最短时间) 问题是如何只在下一行中包含不同状态之间的差异

例如,我将排除表中状态为1的第一条记录,然后选择第二行。状态2的情况也是如此。我会选择最短的时间,计算它们的差异,然后根据每个频道将它们添加到多组状态中

我尝试过使用游标,但似乎无法使其工作。我也非常有信心,在获得所有数据并循环使用之后,我可以在C#中实现这一点。但我只是想知道是否有一种直接的方法可以不通过循环获取信息。我还创建了一个包含数据的应用程序,但似乎无法使其正常工作。我来自C#背景,具备SQL的基本知识。如果有人能帮我,我会很高兴的

CTE()可以像专门的临时表一样使用。它允许您(在本例中)动态创建一个行号,以后可以在该行号上创建自联接

我想你正在寻找这样的东西:

--create temp table
select 19 as id,'2013-08-23 14:52' as activitytime,1 as status
into #temp
union all
select 19,'2013-08-23 14:50',1 union all
select 19,'2013-08-23 14:45',2 union all
select 19,'2013-08-23 14:35',2 union all
select 19,'2013-08-23 14:32',1 union all
select 19,'2013-08-23 14:30',1 union all
select 19,'2013-08-23 14:25',2 union all
select 19,'2013-08-23 14:22',2 union all
select 53,'2013-08-23 14:59',1 union all
select 53,'2013-08-23 14:56',1 union all
select 53,'2013-08-23 14:57',1 union all
select 53,'2013-08-23 14:52',2 union all
select 53,'2013-08-23 14:50',2 union all
select 53,'2013-08-23 14:49',2 union all
select 53,'2013-08-23 14:18',2 union all
select 53,'2013-08-23 14:30',1

--build cte table
;WITH cte
AS (
SELECT 
    *,
    ROW_NUMBER() OVER (ORDER BY  id, activitytime) AS RowNum
FROM 
    #temp
)

--query cte table, self joining row 1 to row 2 to compare.
SELECT a.id, sum(DATEDIFF(minute,b.ActivityTIme,a.ActivityTime)) as TotalTime
FROM 
 cte AS A
 LEFT OUTER JOIN cte AS B   
 ON A.RowNum = B.RowNum + 1 and a.id = b.id
where b.status = 2
group by a.id

14:35到14:50(5分钟)
?5分钟还是15分钟?你应该复习你问题中的规则,确保它是你想要的,因为答案能够帮助你是非常重要的。。你能再详细一点吗?@KingKing,这是个打字错误,谢谢你指出这一点。@NewHire现在你有15分钟+5分钟=30分钟。@Botis,我想得到ID停留在
status=2
上的时差。非常感谢,这看起来很完美,我希望我能多次向上投票给你。请注意,我正在按ID和activitytime排序第一个查询。这就是我建立行顺序的方式。这需要建立,因为您需要知道“下一行”是什么。查询的第二部分是将当前行连接到下一行的递归。此查询计算所有
活动时间
之间的总和,其中
状态
=2,但实际总和必须介于
状态为2的第一行和
状态为1的下一行之间,它统计右侧表格中状态为2的活动时间。在左边的表中,它包括第一个status=1,这允许您在执行datediff时考虑它。使用该sql尝试在底部查询中选择*并查看时间差。