Sql 如何获取某个位置的总时间

Sql 如何获取某个位置的总时间,sql,sql-server,tsql,Sql,Sql Server,Tsql,我是这个论坛的新手,我有一个关于如何获得在某个地点停留时间的问题。假设我有以下数据 DECLARE @T AS TABLE ( ID INT, LOCATION VARCHAR(10), DT DATETIME ) insert into @T VALUES (1,'ED','01/01/2019 12:01' ), (2,'ED','01/01/2019 02:01' ), (3,'ED','01/01/2019 05:01' ), (4,'AB',

我是这个论坛的新手,我有一个关于如何获得在某个地点停留时间的问题。假设我有以下数据

DECLARE @T AS TABLE
(
    ID          INT,
    LOCATION VARCHAR(10),
    DT DATETIME
)

insert into @T VALUES
(1,'ED','01/01/2019 12:01' ),
(2,'ED','01/01/2019 02:01' ),
(3,'ED','01/01/2019 05:01' ),
(4,'AB','01/02/2019 02:01' ),
(5,'AB','01/03/2019 02:01' ),
(6,'ED','01/03/2019 19:01' ),
(7,'ED','01/04/2019 02:01' )


select * from @t
我如何获得在某个地点停留的总时间

最终结果应该是


非常感谢您的帮助。

我认为可以使用类似的查询:

CREATE TABLE #TBL
(
    ID          INT,
    LOCATION VARCHAR(10),
    DT DATETIME
)

insert into #TBL VALUES
(1,'ED','01/01/2019 12:01' ),
(2,'ED','01/01/2019 02:01' ),
(3,'ED','01/01/2019 05:01' ),
(4,'AB','01/02/2019 02:01' ),
(5,'AB','01/03/2019 02:01' ),
(6,'ED','01/03/2019 19:01' ),
(7,'ED','01/04/2019 02:01' )

WITH CTE_1 AS (SELECT LOCATION, DT,  
                ROW_NUMBER() OVER( ORDER BY ID) - ROW_NUMBER() OVER(PARTITION BY LOCATION ORDER BY ID)  as [group]
               FROM #TBL)
SELECT LOCATION,   MIN(DT) FromDate, MAX(DT) ToDate
FROM CTE_1
GROUP BY LOCATION, [group]
ORDER BY FromDate
结果


我相信这正是你想要的:

select location, min(dt), max(coalesce(next_dt, dt))
from (select t.*, lead(dt) over (order by dt) as next_dt,
             row_number() over (partition by location order by dt) as seqnum_l,
             row_number() over (order by dt) as seqnum
      from t
     ) t
group by location, (seqnum - seqnum_l)
order by min(dt);
他是一把小提琴


这是缺口和孤岛问题的一种变体。挑战在于获取下一条记录上的结束日期和时间。

如果按分组,上述查询的结果将仅为2行,对吗?非常感谢您的时间,哈迪,您的查询也很有效。@Streetfighter您应该接受Gordon的回答,因为他发布正确查询的速度更快。好运气,从2019年1月1日12:01到2019年2月1日02:01的
ED和从2019年1月1日12:01到2019年2月1日05:01的
ED?如果员工移动到其他地点,则新地点的进入时间将是最后一个地点的结束时间。在此过程中,员工于2019年2月1日02:01移动到AB位置,因此他在2019年1月1日12:01到2019年2月1日02:01之间处于ED状态。请查看此信息,您可以运行此操作以查找分钟差异,选择DateDiff(分钟,'01/03/2019 19:01','01/04/2019 02:01')作为DateDiff;
select location, min(dt), max(coalesce(next_dt, dt))
from (select t.*, lead(dt) over (order by dt) as next_dt,
             row_number() over (partition by location order by dt) as seqnum_l,
             row_number() over (order by dt) as seqnum
      from t
     ) t
group by location, (seqnum - seqnum_l)
order by min(dt);