2016-11-08 1 views
0

Я хочу получить среднее время между группировкой заказов Клиентом. Я хочу сделать это с помощью sqldf библиотеки Р.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 (мошенника, заявление, bind.data): ошибка в заявлении: возле "(": ошибка синтаксиса»

+1

'LAG (ORDERS_DATE) OVER (PARTITION клиентского ORDER BY ORDERS_DATE)' является особенностью SQL Server; 'sqldf' (вероятно) использует SQLite как свой SQL-движок, поэтому это не сработает. – nrussell

+1

По умолчанию для sqldf является SQLite, но при необходимости можно использовать другие драйверы. См. Документы. –

ответ

2

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") 

 Смежные вопросы

  • Нет связанных вопросов^_^