2016-09-12 7 views
0

私は以下のクエリを書いて分析のためのいくつかのサンプル手段を勉強しましたが、この作業はうまくいきました。しかし、dbGetQueryの制限文とともに、"",; sep=""の使用を理解する必要があります。dbGetQuery内のsql in()クエリの文字列を準備する

df <- data.frame(Sample.Num = integer(), 
       Sample.Mean = integer(), 
       quant.01 = integer(), 
       quant.05 = integer(), 
       quant.10 = integer(), 
       quant.25 = integer(), 
       quant.50 = integer(), 
       quant.75 = integer(), 
       stringsAsFactors = FALSE) 
df[1,] <- NA 
for (i in 1:500){ 
    sdf <- dbGetQuery(con,"select col11,col23,col30 
        from schema.db.name 
        where col1 in ('value1') 
        and col2 in ('(v3) - value3') 
        and col3 in ('v- value4') 
        order by random()*600000 limit 100") 
    meansample <- mean(sdf$mileage,na.rm = TRUE) 
    quant.01 <- quantile(sdf$mileage,na.rm = TRUE,probs = .01) 
    quant.05 <- quantile(sdf$mileage,na.rm = TRUE,probs = .05) 
    quant.10 <- quantile(sdf$mileage,na.rm = TRUE,probs = .10) 
    quant.25 <- quantile(sdf$mileage,na.rm = TRUE,probs = .25) 
    quant.50 <- quantile(sdf$mileage,na.rm = TRUE,probs = .50) 
    quant.75 <- quantile(sdf$mileage,na.rm = TRUE,probs = .75) 
dbDisconnect(con) 

問題:

Col1,2 & 3は、文字値を持っています。今度は、col2の7つの値とcol3の9つの値すべてについて同じことを確認する必要があります。特定の値のcol1,2,3を使用するたびに、ループを終了して2番目の値で再起動する前に、データフレームに格納していくつかの操作を実行する必要があります。

したがって、これは勉強のために呼び出します。Add a dynamic value into RMySQL getQuery

私もgsubshQuoteを勉強しました。私は'", df[i], "';", sep = ""の使用を、limitステートメントとともにいくつかの組み合わせにもかかわらず、概念化することができません。ローカルデータベースであれば、ループを実行するためにdplyrパッケージを使用できました。私はseq_along()が数値を必要としていることを理解しており、in()クエリーの中で正しい '正しい値'を設定するループを通過させるためです。私はpaste0を試して、collapse = "、" arguementsと一緒に引数を貼り付けましたが、助けにはなりませんでした。 私はlapplyを以下のポストから試しましたが、in()クエリの内部では動作しません。

How to do dbGetQuery for loop in R

(V3) - VALUE3、(V1) - 値1等COL内の実際の要素です。これはコードと属性col2、col3などの記述の組み合わせです。

+0

'COL2' ...これは「WHERE IN」条件としては意味をなさないので、あなたが思うように振る舞いません。 –

+0

@Tim Biegeleisen明確に投稿しないことをお詫び申し上げます。 where句で使用されるin()文を準備している間に、あなたが私に "、df [i]、" '; "、sep =" "の使用を説明できる方法はありますか? –

+0

' col2'文字列 '(v3) - value'に対して文字通り条件が正しいが、単一の値で' WHERE IN'を使う必要はありません。代わりに 'WHERE col2 = '(v3) - value' ' –

答えて

0

クエリがあり、その中のいくつかの範囲の値を代入したいとします。

sql <- "select col11,col23,col30 
        from schema.db.name 
        where col1 in (%s) 
        and col2 in (%s) 
        and col3 in (%s) 
        order by random()*600000 limit 100" 

ここで私は、文字列に(%sが)、クエリで ので、私は残っているマーカーを置換を行うためにsprintfのを使用します。我々がテストしたい だから聞かせてセットアップ3範囲:ここで

col1 <- 1:10 
col2 <- c('a', 'f', 'z') 
col3 <- c('name1', 'name2') 

# create strings that are valid in SQL 
col1_sql <- paste(col1, collapse = ',') 
col2_sql <- paste0("'", col2, "'", collapse = ',') # put quotes on strings 
col3_sql <- paste0("'", col3, "'", collapse = ',') 

# now substitute back in query 
sql_new <- sprintf(sql, 
        col1_sql, # strings we just constructed 
        col2_sql, 
        col3_sql 
) 

# print out the query 
cat(sql_new) 

は、クエリがどうなるかである:( '(V3) - 値3')で

select col11,col23,col30 
    from schema.db.name 
    where col1 in (1,2,3,4,5,6,7,8,9,10) 
    and col2 in ('a','f','z') 
    and col3 in ('name1','name2') 
    order by random()*600000 limit 100 
+0

おかげさまで@データ・マングァーこれは、私がsprintfが理解しやすいことを多く理解するのに役立ちます –