如何获得某个位置的总时间

时间:2019-02-22 23:26:22

标签: 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','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

如何获取在一个位置停留的总时间?

最终结果应类似于

  ED from 01/01/2019 12:01 to 01/02/2019 02:01 
  AB from 01/02/2019 02:01 to 01/03/2019 19:01
  ED from 01/03/2019 19:01 to 01/04/2019 02:01

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

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

结果

enter image description here

答案 1 :(得分:2)

我相信这可以满足您的需求

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

Here是db <>小提琴。

这是空白和岛屿问题的一种变体。挑战在于获取结束日期时间,该时间在下一条记录上。