Функция SQL Server LAG () для вычисления различий между строками - PullRequest
0 голосов
/ 07 сентября 2018

Я новичок в SQL Server, и у меня есть некоторые сомнения по поводу функции lag (). Я должен рассчитать среднее расстояние (в днях) между двумя действиями пользователя. Затем я должен GROUP BY всем пользователям, рассчитать все разницы дат между строками для каждого пользователя и, наконец, выбрать среднее значение по группе.

Просто чтобы прояснить, у меня есть такая таблица: original table


Сначала я должен отфильтровать дни с активностями (деятельности! = 0). Тогда я должен создать это:

calculate differences between rows

И, наконец, ожидаемый результат:

what i want

Я думал, что это может быть "своего рода" код:

select userid, avg(diff)
  (SELECT *,DATEDIFF(day, Lag(dateid, 1) OVER(ORDER BY [Userid]), 
   dateid) as diff
   FROM table1
   where activities!=0
   group by userid) t
group by userid

Конечно, это не работает. Я думаю, что я также должен сделать цикл while, так как число меняется для каждого пользователя.

Надеюсь, ты сможешь помочь мне! большое спасибо

Ответы [ 2 ]

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

Вам не нужно lag() вообще. Среднее значение - максимум минус минимум, деленный на единицу меньше, чем количество:

SELECT userid,
       DATEDIFF(day, MIN(dateid), MAX(dateid)) * 1.0 / NULLIF(COUNT(*), 1) as avg_diff
FROM table1
WHERE wager<> 0
GROUP BY userid;
0 голосов
/ 07 сентября 2018

Вы почти у цели. Просто добавьте partition by userid, чтобы рассчитать разницу для каждого идентификатора пользователя, и order by dateid.

select userid, avg(diff)
  (SELECT *,DATEDIFF(day, Lag(dateid, 1) OVER(PARTITION BY [Userid] ORDER BY [dateid]), 
   dateid) as diff
   FROM table1
   where wager!=0
   group by userid) t
group by userid
...