Вычтите следующую строку из предыдущей строки на основе пользователя - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть следующие данные, и я хочу вычесть текущую строку из предыдущей строки на основе идентификатора пользователя.Я попытался код ниже не дал мне то, что я хочу

DECLARE @DATETBLE TABLE (UserID INT, Dates DATE)
INSERT INTO @DATETBLE VALUES
(1,'2018-01-01'), (1,'2018-01-02'), (1,'2018-01-03'),(1,'2018-01-13'),
(2,'2018-01-15'),(2,'2018-01-16'),(2,'2018-01-17'), (5,'2018-02-04'),
(5,'2018-02-05'),(5,'2018-02-06'),(5,'2018-02-11'), (5,'2018-02-17')


;with cte as (
      select UserID,Dates, row_number() over (order by UserID) as seqnum
      from @DATETBLE t
     )
select t.UserID,t.Dates, datediff(day,tprev.Dates,t.Dates)as diff
from cte t left outer join
     cte tprev
     on t.seqnum = tprev.seqnum + 1;

Токовый выход

UserID  Dates   diff
1   2018-01-01  NULL
1   2018-01-02  1
1   2018-01-03  1
1   2018-01-13  10
2   2018-01-15  2
2   2018-01-16  1
2   2018-01-17  1
5   2018-02-04  18
5   2018-02-05  1
5   2018-02-06  1
5   2018-02-11  5
5   2018-02-17  6

Мой ожидаемый выход

  UserID    Dates   diff
    1   2018-01-01  NULL
    1   2018-01-02  1
    1   2018-01-03  1
    1   2018-01-13  10
    2   2018-01-15  NULL
    2   2018-01-16  1
    2   2018-01-17  1
    5   2018-02-04  NULL
    5   2018-02-05  1
    5   2018-02-06  1
    5   2018-02-11  5
    5   2018-02-17  6

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Ваш тег (sql-server-2008) предлагает мне использовать APPLY:

select t.userid, t.dates, datediff(day, t1.dates, t.dates) as diff
from @DATETBLE t outer apply
     ( select top (1) t1.*
       from @DATETBLE t1
       where t1.userid = t.userid and
             t1.dates < t.dates
       order by t1.dates desc
     ) t1;
0 голосов
/ 17 сентября 2018

Если у вас SQL Server версии 2012 или выше, вы можете использовать LAG() с разделом по идентификатору пользователя:

SELECT UserID
     , DATEDIFF(dd,COALESCE(LAG_DATES, Dates), Dates) as diff

FROM

(
SELECT UserID
     , Dates
     , LAG(Dates) OVER (PARTITION BY UserID ORDER BY Dates) as LAG_DATES

FROM @DATETBLE
) exp

Это даст вам значение 0 вместо значения NULL для первой даты в последовательности.

Поскольку вы пометили сообщение с помощью SQL Server 2008, вам может понадобиться метод, не основанный на этой оконной функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...