计算2行2列和不同的userID - SQL 2012

时间:2014-03-18 19:28:55

标签: sql sql-server-2012

我有一个很长的列表(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

我编辑了这个 - 因为我的第一次描述中有一些混乱。

2 个答案:

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