Среднее количество дней между двумя датами по идентификатору (но только для строк перед текущей строкой) - PullRequest
0 голосов
/ 26 июня 2018

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

До

id  date_start  date_end
1   3/3/2015    3/24/2015
1   3/27/2015   4/14/2015
1   4/15/2015   4/30/2015
1   5/1/2015    5/13/2015
1   5/17/2015   5/28/2015
1   7/9/2015    8/7/2015
2   3/7/2015    3/11/2015
3   2/17/2015   4/8/2015
3   4/13/2015   5/5/2015
4   3/12/2015   3/25/2015
4   3/25/2015   4/3/2015
4   4/3/2015    4/10/2015
4   4/10/2015   4/18/2015
5   5/13/2015   6/12/2015
5   6/12/2015   7/15/2015
5   4/19/2015   5/13/2015

После

id  date_start  date_end    AVG_previous_cycle_days
1   3/3/2015    3/24/2015   NULL
1   3/27/2015   4/14/2015   21
1   4/15/2015   4/30/2015   19.5
1   5/1/2015    5/13/2015   18
1   5/17/2015   5/28/2015   16.5
1   7/9/2015    8/7/2015    15.4
2   3/7/2015    3/11/2015   NULL
3   2/17/2015   4/8/2015    NULL
3   4/13/2015   5/5/2015    50
4   3/12/2015   3/25/2015   NULL
4   3/25/2015   4/3/2015    13
4   4/3/2015    4/10/2015   11
4   4/10/2015   4/18/2015   9.67
5   5/13/2015   6/12/2015   NULL
5   6/12/2015   7/15/2015   30
5   4/19/2015   5/13/2015   29

1 Ответ

0 голосов
/ 26 июня 2018

Вы можете сделать вычисление как совокупную сумму, деленную на совокупное количество, но вы должны вычесть текущее значение:

select t.*,
       ( (sum(diff) over (partition by id order by date_start) - diff) /
         (count(*) over (partition by id order by date_start) - 1)
       ) as avg_through_previous
from t cross apply
     (values (datediff(day, date_start, date_end)) v(diff);

На самом деле, вы также можете выразить это с помощью выражения окна:

select t.*,
       avg(diff) over (partition by id
                       order by date_start
                       rows between unbounded preceding and 1 preceding
                      ) as avg_through_previous
from t cross apply
     (values (datediff(day, date_start, date_end)) v(diff);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...