我有一个很长的列表(10000多条记录),我需要计算结束时间和开始相关UserID之间的时间。
所以 - 我有一个UserID,StartDate(datetime)和EndDate(datetime)。
我试图与这段代码相处 - 但我得不到我需要的东西 - 每个用户的开始和结束之间的时间。如何添加“UserID”部分 - 以获取UserID下一行的结束和开始之间的区别?
declare @MyTable table
(UserID int, StartDate datetime, FinishDate datetime);
insert into @MyTable values
('1', '2013-11-25 14:25', '2013-11-25 16:35'),
('2', '2013-12-01 10:20', '2013-12-02 12:20'),
('2', '2013-12-06 09:15', '2013-12-06 16:15'),
('1', '2013-12-08 08:00', '2013-12-08 16:30'),
('1', '2013-12-09 07:45', '2013-12-15 09:45');
with CTE_RN as
(
select
StartDate,
FinishDate,
ROW_NUMBER() OVER(ORDER BY StartDate) as RN
from @MyTable
)
select
f.FinishDate,
s.StartDate,
DATEDIFF(minute, f.FinishDate, s.StartDate) as DifHours
from CTE_RN as f
inner join CTE_RN as s
on s.RN = f.RN + 1
我编辑了这个 - 因为我的第一次描述中有一些混乱。
答案 0 :(得分:0)
您可以使用LEAD()
而不使用self-join
,这可能对您的查询有所帮助。
您是否可以在示例数据集中进行更好的理解。 从您的查询看,一组useridet,userid似乎有多行。需要更多信息清晰度......
试试这个......
declare @MyTable table
(UserID int, StartDate datetime, FinishDate datetime);
insert into @MyTable values
('1', '2013-11-25 14:25', '2013-11-25 16:35'),
('2', '2013-12-01 10:20', '2013-12-02 12:20'),
('2', '2013-12-06 09:15', '2013-12-06 16:15'),
('1', '2013-12-08 08:00', '2013-12-08 16:30'),
('1', '2013-12-09 07:45', '2013-12-15 09:45');
select
FinishDate New_Start_dt,
LEAD(startdate,1,NULL) over(partition by userid order by startdate) New_finish_dt,
DATEDIFF(minute,FinishDate,LEAD(StartDate,1,NULL) over(partition by userid order by StartDate)) as DifHours
from @MyTable
答案 1 :(得分:0)
我认为......这是解决方案:
declare @MyTable table
(UserID int, StartDate datetime, FinishDate datetime);
insert into @MyTable values
('1', '2013-11-25 14:25', '2013-11-25 16:35'),
('1', '2013-12-08 08:00', '2013-12-08 16:30'),
('2', '2013-12-06 09:15', '2013-12-06 16:15'),
('2', '2013-12-01 10:20', '2013-12-02 12:20'),
('1', '2013-12-09 07:45', '2013-12-15 09:45');
with CTE_RN as
(
select
UserID,
StartDate,
FinishDate,
ROW_NUMBER() OVER(ORDER BY UserID,StartDate) as RN
from @MyTable
)
select
s.UserID,
f.FinishDate,
s.StartDate,
DATEDIFF(minute, f.FinishDate, s.StartDate) as DifMin
from CTE_RN as f
inner join CTE_RN as s
on s.RN = f.RN + 1
where s.UserID=f.UserID