Ada*_*ack 7 sql r dplyr tidyverse dbplyr
假设我有一个名为的外部数据库的连接con.
我想dplyr用来重现这个查询
SELECT var1, var2, var3 from myTable LIMIT 10
Run Code Online (Sandbox Code Playgroud)
我试过了
qry <- tbl(con, "myTable") %>%
select(var1) %>%
filter(between(row_number(), 1, 10)
Run Code Online (Sandbox Code Playgroud)
但它没有给出所需的结果,它产生的查询比我之后的查询慢得多.
它产生的查询是
SELECT "var1",
FROM SELECT "var1", row_number() OVER () AS "zzz25"
FROM SELECT "var1" AS "var1"
FROM myTable "yhydrqlhho") "zsdfunxidf"
WHERE zzz25 BETWEEN 1.0 AND 10.0)
Run Code Online (Sandbox Code Playgroud)
当我将此查询发送到数据库时,它会运行很长时间.当我发送
SELECT var1 from myTable limit 10
Run Code Online (Sandbox Code Playgroud)
结果瞬间回来了.
Psi*_*dom 12
你可以尝试head(10),它生成正确的SQL查询Postgres:
tbl(con, 'my_table') %>% select(var1, var2) %>% head(6) %>% explain()
# here con is a PostgreSQL connection
#<SQL>
#SELECT "var1" AS "var1", "var2" AS "var2"
#FROM "my_table"
#LIMIT 6
Run Code Online (Sandbox Code Playgroud)
如果您从查询中获取实际数据,而不仅仅是重新创建 SQL 查询,那么指定collect(n=10)将提供与@Psidom 的答案相同的输出。
tbl(con, 'my_table') %>% select(var1, var2) %>% collect(n=10)
# A tibble: 10 x 2
var1 var2
<chr> <dbl>
1 text1 87.8
2 text2 99.6
3 text3 100
4 text4 91.9
5 text5 76.8
6 text6 77.8
7 text7 77.2
8 text8 97.2
9 text9 97.5
10 text10 80.4
Run Code Online (Sandbox Code Playgroud)
请注意,默认值collect()是n = 1e+05,因此如果您的数据(过滤后)包含更多行,则需要指定collect(n=Inf)以检索它。
| 归档时间: |
|
| 查看次数: |
1931 次 |
| 最近记录: |