tail() 相当于使用 dbplyr? (即 return 数据库的最后 x 行 table)

tail() equivalent using dbplyr? (i.e. return last x rows of database table)

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

library(dbplyr)

sometable %>%
  head()

然后我们看到前 6 行。

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

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

expected behaviour of dbplyr:

Because you can’t find the last few rows without executing the whole query, you can’t use tail().

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

一般来说,永远不要假设 SQL 查询的顺序,因为 DBMS 可能会以适合索引或其他原因的顺序存储它,而不是基于您想要的顺序。因此,SQL 查询的一个常见“最佳实践”是 (a) 假设数据是无序的(也许顺序可能会改变,尽管我在实践中没有看到这一点);或 (b) 在查询中强制排序。

据此,考虑以降序方式排列数据并使用 head

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

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 服务器连接上进行了演示,但前提应该同样适用于其他 DBMS 类型,它们只会从 SELECT TOP(6) ... 转移到 SELECT ... LIMIT 6 或类似的。)