2016-11-08 43 views
0

我想獲取客戶之間訂單分組之間的平均時間。我想這樣做與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,聲明, (「:語法錯誤」

+1

'LAG(ORDERS_DATE)OVER'是SQL Server功能(由客戶端ORDER BY ORDERS_DATE分區); 'sqldf'(很可能)使用SQLite作爲它的SQL引擎,所以這是行不通的。 – nrussell

+1

sqldf的默認值是SQLite,但如果需要可以使用其他驅動程序。看文檔。 –

回答

2

lag,partition by,over等可以只能用於PostgreSQL後端到sqldf。假設你正在使用默認的SQLite後端,並假設我們希望按升序排序的訂單的平均差異,我們可以做到這一點。

假設在時間t1有4個訂單< = 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")