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
或类似的。)
假设使用 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
或类似的。)