gpt4 book ai didi

sql - 获取一组记录之间的时间差

转载 作者:行者123 更新时间:2023-12-02 23:38:26 24 4
gpt4 key购买 nike

我有一个具有以下结构的表

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

我想计算每个 ID 相对于状态 2 的总时间差。例如,ID 19 从 14:35 到 14:50(15 分钟)停留在状态 2,然后是 14:22 到 14:30(8 分钟) )。因此 ID 19 在状态 2 上停留的总时间为 23 分钟。 (在这两种情况下,我都考虑了状态 2 到状态 1 的最短时间) 问题是我如何仅在下一行中包含不同状态之间的差异。

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

我尝试过使用 CURSOR 但似乎无法使其工作。我也非常有信心,在获取所有数据然后循环遍历之后,我可以在 C# 中实现这一目标。但我只是想知道是否有一种无需循环即可直接获取信息的方法。我还创建了一个 SQL fiddle有数据,但我似乎无法让它发挥作用。我有 C# 背景,具有 SQL 基础知识。如果有人能帮助我,我会很高兴。

最佳答案

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

我认为您正在寻找这样的东西:

--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

关于sql - 获取一组记录之间的时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18409254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com