[英]R, SQL query in for loop
我有一個包含客戶及其ID的列表。 看起來像下面的一個:
customers_id <- list(x = John(1,2,3), Rick = c(4), Sam = c(5,6))
和一個看起來像下面的數據庫,並調用“ db”
date id value
2017-05-12 1 51
2017-05-13 2 3
2017-05-14 3 217
2017-05-15 1 12
2017-05-16 2 98
2017-05-17 3 123
2017-05-18 1 78
2017-05-19 2 36
2017-05-20 4 178
2017-05-18 5 728
2017-05-19 6 336
2017-05-20 4 718
2017-05-18 5 758
2017-05-19 6 366
2017-05-20 4 787
我試圖制作一個for循環,但找不到正確的解決方案。 我認為在循環中應該是一個查詢,該查詢將獲取正確的ID和ID的總和
corect_values <- paste(" SELECT date, id, SUM(value) FROM db WHERE id = '", id, "' ")
因此,我有兩個問題:如何將查詢放入for循環以及如何編寫將客戶的所有ID考慮在內的sql查詢。
結果應如下所示:
John 618
Rick 1683
Sam 2188
您是否知道如何解決? 謝謝你的幫助 !
假設您有一個客戶名稱和ID的data.frame就像這樣...
customers_id <- data.frame(Names = c("John", "John", "John", "Rick", "Sam", "Sam"),
id = c(1:6))
從db查詢所有id和值...可以說這已分配給df
SELECT id, value FROM db
現在,您可以在名稱上使用left_join,將其分組並求和。
library(dplyr)
df <- left_join (df, customers_id, by = "id")
result <- df %>%
group_by(Names) %>%
summarise(value = sum(value))
此代碼求和
SELECT SUM(values)total from db WHEREcustomers_id = id;
我將盡我所能描述:當您有2張桌子時:(讓您拿桌子)
Table_A) ID, user_name
Table_B) ID, date, user_id(matched to the table above as a foreign key), value
您可以執行以下查詢:
SELECT Table_A.user_name, sum(Table_B.value)
FROM Table_A join Table_B on Table_a.ID = Table_B.user_id
GROUP BY Table_A.ID
該查詢將匯總您擁有的所有用戶的所有值。 它只會為每個用戶顯示一個條目,所有值都匯總在一起
此選擇是否可以提供預期的結果?
customer_id = sample(c(1:6), 10, replace = T) # just some dummy-user ids as an example
customer_id = paste0("'", customer_id, "'")
customer_id = paste(customer_id, collapse = ", ")
corect_values = paste0("SELECT sum(value) FROM db where id IN (", customer_id, ") GROUP BY id")
ofc並非如此,因為您不想按ID分組,但按名稱和名稱分組並不僅限於一個ID。
也許這可以解決問題。 缺點是:您仍然必須要求每個名稱。 因此,即使以下代碼可行,我認為還是最好在數據庫中創建一個引用表,以將名稱和ID聯接起來,就像@Andrei Fiordean在評論中建議的那樣。
select_this <- function(temp_ids)
{
temp_ids = paste0("'", temp_ids, "'")
temp_ids = paste(temp_ids, collapse = ", ")
corect_values = paste0("SELECT sum(value) FROM db where id IN (", temp_ids, ")")
# results = request select from db here
return(results)
}
customers_id <- list("John" = c(1,2,3), "Rick" = c(4), "Sam" = c(5,6))
sapply(customers_id, select_this)
如果您確實需要使用for循環僅針對特定客戶運行查詢,則可以執行以下操作:
for (i in 1:length(customers_id)) {
sql_q <- paste0("SELECT '", names(customers_id)[i], "' AS customer, sum(value) AS value FROM db WHERE id IN (", paste(customers_id[[i]], collapse = ", "), ")")
}
sql_q
返回
[1] "SELECT 'John' AS customer, sum(value) AS value FROM db WHERE id IN (1, 2, 3)"
[1] "SELECT 'Rick' AS customer, sum(value) AS value FROM db WHERE id IN (4)"
[1] "SELECT 'Sam' AS customer, sum(value) AS value FROM db WHERE id IN (5, 6)"
然后只需附加數據即可得到結果,例如
# Example Data given
customers_id <- list(John = c(1,2,3), Rick = c(4), Sam = c(5,6))
# Assuming you have your db connection setup in 'con'
sql_list <- list()
for (i in 1:length(customers_id)) {
sql_q <- paste0("SELECT '", names(customers_id)[i], "' AS customer, sum(value) AS value FROM db WHERE id IN (", paste(customers_id[[i]], collapse = ", "), ")")
sql_d <- sqlQuery(con, sql_q)
sql_list[[i]] <- sql_d
}
combined_d <- do.call("rbind", sql_list)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.