假设我有一个名为con
的外部数据库的连接。
我想使用dplyr
来重现此查询
SELECT var1, var2, var3 from myTable LIMIT 10
我试过了
qry <- tbl(con, "myTable") %>%
select(var1) %>%
filter(between(row_number(), 1, 10)
但它没有给出所需的结果,它产生的查询比我之后的查询要慢得多。
它产生的查询是
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)
当我将此查询发送到数据库时,它会运行很长时间。当我发送
SELECT var1 from myTable limit 10
结果立刻回来了。
答案 0 :(得分:8)
您可以尝试head(10)
,它会在Postgres
上生成正确的SQL查询:
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
答案 1 :(得分:0)
如果您要查询的是实际数据,而不仅仅是重新创建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
请注意,collect()
中的默认值为n = 1e+05
,因此,如果您的数据(过滤后)包含更多行,则需要指定collect(n=Inf)
进行检索。