Sqldf: ошибка в result_create (conn @ ptr, оператор): почти «над»: синтаксическая ошибка в R - PullRequest
1 голос
/ 07 марта 2019

Пример моих данных

mydata=structure(list(generated_id = c(1003477323030100, 1003477323030100, 
1003477323030100, 1003477323030100, 1003477323030100, 1003477323030100, 
1003477323030100, 1003477323030100, 1003477323030100, 1003477323030100, 
1003477323030100, 1003477323030100, 1003477323030100, 1003477323030100, 
1003477323030100, 1003477323030100, 1003477323030100), campaign_id.x = c(23843069854050700, 
23843069854050700, 23843069854050700, 23843069854050700, 23843069854050700, 
23843069854050700, 23843069854050700, 23843069854050700, 23843069854050700, 
23843069854050700, 23843069854050700, 23843069854050700, 23843069854050700, 
23843069854050700, 23843069854050700, 23843069854050700, 23843069854050700
), campaign_id.y = c(23843069854050700, 23843069854050700, 23843069854050700, 
23843069854050700, 23843069854050700, 23843069854050700, 23843069854050700, 
23843069854050700, 23843069854050700, 23843069854050700, 23843069854050700, 
23843069854050700, 23843069854050700, 23843069854050700, 23843069854050700, 
23843069854050700, 23843069854050700), spent = c(73.5, 73.5, 
73.5, 73.5, 73.5, 73.5, 73.5, 73.5, 73.5, 73.5, 73.5, 29.74, 
29.74, 29.74, 29.74, 29.74, 29.74), date = structure(c(1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("04.10.2018", 
"26.09.2018"), class = "factor"), realpurchase_cash = c(1.49, 
1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 
1.49, 1.49, 1.49, 1.49, 1.49), utc_time.y = structure(c(5L, 8L, 
2L, 1L, 4L, 4L, 9L, 10L, 6L, 3L, 7L, 5L, 8L, 2L, 1L, 4L, 4L), .Label = c("01.10.2018 22:26", 
"05.10.2018 22:34", "05.10.2018 22:35", "06.10.2018 13:43", "07.10.2018 15:55", 
"30.09.2018 11:22", "30.09.2018 11:23", "30.09.2018 12:00", "30.09.2018 12:23", 
"30.09.2018 18:12"), class = "factor")), .Names = c("generated_id", 
"campaign_id.x", "campaign_id.y", "spent", "date", "realpurchase_cash", 
"utc_time.y"), class = "data.frame", row.names = c(NA, -17L))

Мне нужно изменить структуру следующим образом:

если для группы generated_id +capmaing_id.x+campaing_id.y агрегированное значение до 90 дней realpurchase_cashбольше, чем агрегированное значение потраченных до 90 дней, тогда всей группе присваивается 1, в противном случае - 0. Для агрегирования затрат по сумме по месяцам это дата столбца, но для агрегирования realpurchase_cash по сумме по месяцамэто столбец utc_time.y

, поэтому агрегированная сумма для потраченных 984 за 2 месяца и агрегированная сумма для realpurchase_cash = 25, поэтому флаг = 0

, каждая группа имеет данные до 90 днейне более.

IEoutput

Я решил использовать решение sqldf, потому что я работаю с SQL, я делаю это

a1s <- sqldf("
select 
generated_id,
[capmaing_id.x],
[campaign_id.y],
spent,
[date],
[utc_time.y],
realpurchase_cash,
--SUM(spent) over (partition by generated_id,[capmaing_id.x],[campaign_id.y]) as sum_spent,
--SUM(realpurchase_cash)  over (partition by generated_id,[capmaing_id.x],[campaign_id.y])  as sum_realpurchase_cash
case when SUM(realpurchase_cash)  over (partition by generated_id,[capmaing_id.x],[campaign_id.y])>SUM(spent) over (partition by generated_id,[capmaing_id.x],[campaign_id.y]) then 1 else 0 end as flag
from newest3
")

и получаю ошибку

Error in result_create(conn@ptr, statement) : near "over": syntax error

Как правильно сделать?

1 Ответ

2 голосов
/ 07 марта 2019

Полагаю, вопрос в том, почему выдается ошибка.

Пока RSQLite не обновится до последней версии базы данных SQLite, управление окнами не будет работать. Вместо этого используйте RPostgreSQL бэкэнд. С этим бэкэндом используйте "..." вместо [...], а также исправьте орфографические и другие ошибки в выражении sql, показанном в вопросе.

Не дает синтаксических ошибок (при условии, что сервер PostgreSQL установлен и работает).

library(sqldf)
library(RPostgreSQL)

a1s <- sqldf('
SELECT
   "generated_id",
   "campaign_id.x",
   "campaign_id.y",
   "spent",
   "date",
   "utc_time.y",
   "realpurchase_cash",
   --SUM(spent) over (partition by generated_id,[campaign_id.x],[campaign_id.y]) as sum_spent,
   --SUM(realpurchase_cash)  over (partition by generated_id,[campaign_id.x],[campaign_id.y])  as sum_realpurchase_cash
   CASE WHEN SUM("realpurchase_cash") OVER 
         (PARTITION BY "generated_id", "campaign_id.x", "campaign_id.y") > 
         SUM(spent) OVER (PARTITION BY "generated_id", "campaign_id.x", "campaign_id.y") 
        THEN 1 ELSE 0 
   END AS "flag" 
FROM "mydata"')

дает:

> a1s
   generated_id campaign_id.x campaign_id.y spent       date       utc_time.y realpurchase_cash flag
1  1.003477e+15  2.384307e+16  2.384307e+16 73.50 04.10.2018 07.10.2018 15:55              1.49    0
2  1.003477e+15  2.384307e+16  2.384307e+16 73.50 04.10.2018 30.09.2018 12:00              1.49    0
3  1.003477e+15  2.384307e+16  2.384307e+16 73.50 04.10.2018 05.10.2018 22:34              1.49    0
4  1.003477e+15  2.384307e+16  2.384307e+16 73.50 04.10.2018 01.10.2018 22:26              1.49    0
5  1.003477e+15  2.384307e+16  2.384307e+16 73.50 04.10.2018 06.10.2018 13:43              1.49    0
6  1.003477e+15  2.384307e+16  2.384307e+16 73.50 04.10.2018 06.10.2018 13:43              1.49    0
7  1.003477e+15  2.384307e+16  2.384307e+16 73.50 04.10.2018 30.09.2018 12:23              1.49    0
8  1.003477e+15  2.384307e+16  2.384307e+16 73.50 04.10.2018 30.09.2018 18:12              1.49    0
9  1.003477e+15  2.384307e+16  2.384307e+16 73.50 04.10.2018 30.09.2018 11:22              1.49    0
10 1.003477e+15  2.384307e+16  2.384307e+16 73.50 04.10.2018 05.10.2018 22:35              1.49    0
11 1.003477e+15  2.384307e+16  2.384307e+16 73.50 04.10.2018 30.09.2018 11:23              1.49    0
12 1.003477e+15  2.384307e+16  2.384307e+16 29.74 26.09.2018 07.10.2018 15:55              1.49    0
13 1.003477e+15  2.384307e+16  2.384307e+16 29.74 26.09.2018 30.09.2018 12:00              1.49    0
14 1.003477e+15  2.384307e+16  2.384307e+16 29.74 26.09.2018 05.10.2018 22:34              1.49    0
15 1.003477e+15  2.384307e+16  2.384307e+16 29.74 26.09.2018 01.10.2018 22:26              1.49    0
16 1.003477e+15  2.384307e+16  2.384307e+16 29.74 26.09.2018 06.10.2018 13:43              1.49    0
17 1.003477e+15  2.384307e+16  2.384307e+16 29.74 26.09.2018 06.10.2018 13:43              1.49    0
...