2017-08-24 8 views
-1

J'ai deux tables de clients et de l'ordre, je veux filtrer le customer_id qui répond à la demande de l'étape 1 et l'étape 2, alors que quand je fais la step2.5, la console montreerreur sqldf en r lors de l'adhésion des tables

Error: Cannot pass NA to dbQuoteIdentifier() 
In addition: Warning message: 
In field_types[] <- field_types[names(data)] : 
    number of items to replace is not a multiple of replacement length 

Table

Etape 1 < - sqldf ("select * from customer_table comme rejoindre ct intérieur comme order_table ot SUR ct.customer_id = ot.customer_id où order_date < 20161222 et ORDER_AMOUNT = 1 groupe par ct.customer_id; ")

step2<- sqldf("select ot.customer_id from order_table as ot 
       where order_date between 20161222 and 20170222 
       and order_amount=0 
       group by ot.customer_id;") 

step2.5<- sqldf("select * from step1 as s1 inner join step2 as s2 on s1.customer_id=s2.customer_id; ") 

Quelqu'un pourrait aider Merci

+2

Vos requêtes regorgent d'erreurs. Veuillez expliquer ce que vous essayez de faire et, idéalement, donnez-nous quelques exemples de données de table. Habituellement, cela n'a pas de sens de faire un «GROUP BY» sans également sélectionner un ou plusieurs agrégats de colonnes. Votre 'step2.5' est presque certain d'échouer; vous ne pouvez pas simplement faire référence à un jeu de résultats de requête R comme ça. –

+0

@TimBiegeleisen parce que je veux filtrer le –

+0

Même client_id qui step1 et step2 ont –

Répondre

1

Je ne suis pas en mesure de reproduire une erreur?. J'ai apporté quelques améliorations au SQL, mais si cela ne résout pas votre problème, veuillez fournir vos données dans un format reproductible dans votre question.

data(iris) 
customer_table <- iris 
order_table <- iris 

customer_table$customer_id <- 1:nrow(iris) 
order_table$customer_id <- 1:nrow(iris) 

customer_table$order_amount <- 1 
order_table$order_amount <- 0 
order_table$order_date  <- rep(c(20161221, 20161223)) 

step1 <- sqldf("select ct.* 
       from customer_table ct 
       join order_table ot on 
       ct.customer_id=ot.customer_id 
       where ot.order_date < 20161222 
       and ct.order_amount=1 
       group by ct.customer_id") 

step2 <- sqldf("select customer_id 
       from order_table 
       where order_date 
       between 20161222 and 20170222 
       and order_amount=0 
       group by customer_id") 

step2.5 <- sqldf("select * from step1 s1 
       join step2 s2 
       on s1.customer_id=s2.customer_id") 

Cette preuve de concept crée une table sans erreur. Cette table a correctement 0 lignes en utilisant cet exemple de données.

+1

Merci et j'ajouterai mes données plus tard –

+0

Voici ce que je veux faire: Sélectionner les clients dans la table des clients, qui n'a effectué qu'un achat avant le 2016/12/22; Pour les utilisateurs de l'étape 1, filtrez les utilisateurs qui n'ont rien acheté entre le 22 décembre 2016 et le 22 février 2017, alias ce groupe d'utilisateurs qui reste inactif pendant 3 mois. –

+0

@JeffHoffman Je ne vois pas pourquoi il y aurait une erreur. Ce doit vraiment être vos données. S'il vous plaît visitez le lien dans mon commentaire sur votre question pour voir quelles formes de données reproductibles sont nécessaires pour la balise R, par exemple dput() –