微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用dbplyr等效的tail吗? 即返回数据库表的最后x行

如何解决使用dbplyr等效的tail吗? 即返回数据库表的最后x行

假设使用dbplyr,我们有类似的东西

library(dbplyr)

soMetable %>%
  head()

然后我们看到前6行。

但是,如果我们尝试这样做,我们会看到错误

soMetable %>%
  tail()
# Error: tail() is not supported by sql sources

expected behaviour of dbplyr

因为如果不执行整个查询就找不到最后几行,则不能使用tail()。

问题:在这种情况下,我们如何做tail()等效项?

解决方法

通常,切勿假定SQL查询的顺序,因为DBMS可能以出于索引或其他原因的理想顺序存储它,而不是根据您想要的顺序存储。因此,SQL查询的一种常见“最佳实践”是:(a)假设数据是无序的(也许顺序可能会更改,尽管我在实践中尚未见过);或(b)在查询中强制排序。

因此,请考虑按降序排列数据并使用head

例如,如果我有一个带有数字字段MyTable的表MyNumber,那么

library(dplyr)
library(dbplyr)
tb <- tbl(con,"MyTable")
tb %>%
  arrange(MyNumber) %>%
  tail() %>%
  sql_render()
# Error: tail() is not supported by sql sources
tb %>%
  arrange(MyNumber) %>%
  head() %>%
  sql_render()
# <SQL> SELECT TOP(6) *
# FROM "MyTable"
# ORDER BY "MyNumber"
tb %>%
  arrange(desc(MyNumber)) %>%
  head() %>%
  sql_render()
# <SQL> SELECT TOP(6) *
# FROM "MyTable"
# ORDER BY "MyNumber" DESC

((显然)在SQL Server连接上进行了演示,但是前提对于其他DBMS类型也应同样有效,它们将从SELECT TOP(6) ...变为SELECT ... LIMIT 6或类似名称。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。