簡體   English   中英

R,for循環中的SQL查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM