sqldf R - дни между заказами - группировка по клиенту

Я хочу получить среднее время между группировкой заказов по клиенту. Я хочу сделать это с помощью библиотеки sqldf R.

Данные испытаний:

  > test
+    CLIENT ORDERS_DATE
+    1   2014-09-22
+    1   2014-12-16
+    2   2014-10-08
+    2   2014-10-12
+    2   2014-10-26
+    2   2014-11-06

sqldf-код:

> avg.time.orders.before = sqldf("SELECT CLIENT , AVG(ORDERS_DATE - lag_orderdate) AS avg_time_between_orders
FROM (
SELECT CLIENT , ORDERS_DATE , LAG(ORDERS_DATE) OVER (PARTITION by CLIENT ORDER BY ORDERS_DATE) AS lag_orderdate
 FROM  test
)
GROUP BY CLIENT")

Я получаю следующее сообщение об ошибке: «Ошибка в sqliteSendQuery (con, statement, bind.data): ошибка в заявлении: рядом с «(»: синтаксическая ошибка»


person Mario M.    schedule 08.11.2016    source источник
comment
LAG(ORDERS_DATE) OVER (PARTITION by CLIENT ORDER BY ORDERS_DATE) — это функция SQL Server; sqldf (скорее всего) использует SQLite в качестве механизма SQL, так что это не сработает.   -  person nrussell    schedule 08.11.2016
comment
По умолчанию для sqldf используется SQLite, но при желании можно использовать и другие драйверы. См. документы.   -  person IRTFM    schedule 08.11.2016


Ответы (1)


lag, partition by, over и т. д. можно использовать только с серверной частью PostgreSQL для sqldf. Предполагая, что вы используете серверную часть SQLite по умолчанию, и предполагая, что нам нужна средняя разница для заказов, отсортированных в порядке возрастания, мы можем это сделать.

Предположим, что было 4 заказа в моменты времени t1 ‹= t2 ‹= t3 ‹= t4. Тогда средняя разница будет

((t4-t3) + (t3-t2) + (t2-t1)) / (4 - 1)
= (t4 - t1) / (4 - 1)

где t1 — самый старый заказ, а t4 — самый новый. Таким образом, в общем случае телескопическая сумма сводится к разнице между последним и первым порядком, а среднее значение равно разнице между количеством порядков минус 1. Таким образом, мы имеем:

sqldf("select CLIENT, (max(ORDERS_DATE) - min(ORDERS_DATE)) / (count(*) - 1) AVG_DIFF 
       from test 
       group by CLIENT")

давая:

  CLIENT  AVG_DIFF
1      1 85.000000
2      2  9.666667

Мы можем дважды проверить это, проверив, что он дает тот же ответ, что и следующий - это даст тот же ответ, если заказы отсортированы внутри КЛИЕНТА, что, похоже, имеет место в вопросе:

aggregate(ORDERS_DATE ~ CLIENT, test, function(x) mean(diff(x)))

Примечание. Мы предполагаем, что ввод:

test <-
structure(list(CLIENT = c(1L, 1L, 2L, 2L, 2L, 2L), ORDERS_DATE =     
structure(c(16335, 16420, 16351, 16355, 16369, 16380), class = "Date")),   
.Names = c("CLIENT", "ORDERS_DATE"), row.names = c(NA, -6L), class = "data.frame")
person G. Grothendieck    schedule 09.11.2016