Olá,
Estou tendo problemas com a transcrição do dbdplyr para mysql quando uso as funções (min ou slice_min e max ou slice_max).
O problemas pode ser exemplificado através do código abaixo:
------------------------------------------------------------------------------------------------
library(dbplyr)
tab <- tbl_lazy(iris, con = simulate_mysql())
query <-
tab %>%
group_by(Species) %>%
filter(Petal.Width == min(Petal.Width ))
query %>% show_query()
SELECT `Sepal.Length`, `Sepal.Width`, `Petal.Length`, `Petal.Width`, `Species`
FROM (SELECT `Sepal.Length`, `Sepal.Width`, `Petal.Length`, `Petal.Width`, `Species`, MIN(`Petal.Width`) OVER (PARTITION BY `Species`) AS `zzz4`
FROM `df`) `dbplyr_003`
WHERE (`Petal.Width` = `zzz4`)
------------------------------------------------------------------------------------------------
Como pode ver, a consulta retornada esta incorreta e portanto quando trabalho conectado com um DB retorna um erro de sintaxe.
Desde já, agradeço a atenção dispensada.
Athos
Junho 3, 2020, 9:50pm
2
@Fabio_Franco Olhando o código não ficou evidente o erro de sintaxe. Qual erro que ele solta?
No código abaixo eu rodei como se fosse num BD e deu certo
library(dbplyr)
library(dplyr)
# Fazendo conexão com banco de dados
conexao <- RSQLite::dbConnect(RSQLite::SQLite(), ":memory:")
copy_to(conexao, iris)
RSQLite::dbListTables(conexao)
#> [1] "iris" "sqlite_stat1" "sqlite_stat4"
tab <- tbl(conexao, "iris")
query <-
tab %>%
group_by(Species) %>%
filter(Petal.Width == min(Petal.Width ))
query %>% show_query()
#> <SQL>
#> Warning: Missing values are always removed in SQL.
#> Use `MIN(x, na.rm = TRUE)` to silence this warning
#> This warning is displayed only once per session.
#> SELECT `Sepal.Length`, `Sepal.Width`, `Petal.Length`, `Petal.Width`, `Species`
#> FROM (SELECT `Sepal.Length`, `Sepal.Width`, `Petal.Length`, `Petal.Width`, `Species`, MIN(`Petal.Width`) OVER (PARTITION BY `Species`) AS `zzz3`
#> FROM `iris`)
#> WHERE (`Petal.Width` = `zzz3`)
Created on 2020-06-03 by the reprex package (v0.3.0)
O Warning que solta é em relação aos NAs no SQL, mas não é um erro.