如何在 dbplyr 中“排列”聚合变量?

Posted

技术标签:

【中文标题】如何在 dbplyr 中“排列”聚合变量?【英文标题】:How to "arrange" aggregate variable in dbplyr? 【发布时间】:2019-12-13 19:07:55 【问题描述】:

以下 dbplyr 语句失败:

foo <- activity_viewed %>% group_by(pk) %>% summarize(total = n()) %>%
  arrange(-total) %>% head(3) %>% collect()

出现此错误:

Error in postgresqlExecStatement(conn, statement, ...) : 
  RS-DBI driver: (could not Retrieve the result : ERROR:  column "total" does not exist
LINE 4: ORDER BY -"total"
                  ^
)

我可以在查询中看到问题:SQL 不允许 ORDER BY 使用列别名。

这是生成的查询:

> print(show_query(foo))
<SQL>
SELECT "pk", COUNT(*) AS "total"
FROM "activity"
GROUP BY "pk"
ORDER BY -"total"
LIMIT 3

我需要ORDER BY -COUNT(*)

如何让dbplyr 执行此查询?

【问题讨论】:

【参考方案1】:

dbplyr 可以翻译 desc 但不能翻译 -

library(dplyr) 
library(dbplyr) 
mtcars2 <- src_memdb() %>% 
           copy_to(mtcars, name = "mtcars2-cc", overwrite = TRUE)
mtcars2 %>% arrange(desc(cyl)) %>% show_query()
<SQL>
SELECT *
FROM `mtcars2-cc`
ORDER BY `cyl` DESC

【讨论】:

以上是关于如何在 dbplyr 中“排列”聚合变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有数据库连接的情况下从 dbplyr 生成 SQL?

从 dbplyr 中的给定 SQL 查询开始使用 dbplyr

使用 dbplyr 和 corrr 的两个变量之间的分组相关性

选择数组包含 bigquery 中多个值之一的行(最好使用 dbplyr)

使用 memdb 和 dbplyr 设置覆盖 == TRUE

用 dbplyr 总结的五位数