23

我正在使用 R 绘制我从数据库中提取的一些数据(具体来说是Stack Exchange 数据转储):

dplyr::tbl(serverfault, 
           dbplyr::sql("
select year(p.CreationDate) year,
       avg(p.AnswerCount*1.0) answers_per_question,
       sum(iif(ClosedDate is null, 0.0, 100.0))/count(*) close_rate
from Posts p
where PostTypeId = 1
group by year(p.CreationDate)
order by year(p.CreationDate)
"))

该查询在 SEDE 上运行良好,但我在 R 控制台中收到此错误:

Error: <SQL> 'SELECT *
FROM (
select year(p.CreationDate) year,
       avg(p.AnswerCount*1.0) answers_per_question,
       sum(iif(ClosedDate is null, 0.0, 100.0))/count(*) close_rate
from Posts p
where PostTypeId = 1
group by year(p.CreationDate)
order by year(p.CreationDate)
) "zzz11"
WHERE (0 = 1)'
  nanodbc/nanodbc.cpp:1587: 42000: [FreeTDS][SQL Server]Statement(s) could not be prepared. 

我认为“无法准备声明”。意味着 SQL Server 出于某种原因不喜欢该查询。不幸的是,它没有给出任何关于出了什么问题的提示。根据错误消息,在稍微摆弄了一下查询之后,我注意到它被包裹在一个子选择中。复制并执行由链中的一个库构建的完整查询,SQL Server 给了我这个信息更丰富的错误消息:

ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP、OFFSET 或 FOR XML。

现在解决方案很明显:删除(或注释掉)该order by子句。但是R 控制台中的详细错误消息在哪里?我正在使用 Rstudio,如果有的话。如果我可以在我正在处理的代码旁边获得完整的异常,它将帮助我更快地修复错误。(为了清楚起见,我经常从 dplyr::tbl 收到神秘错误,并且通常使用二进制搜索调试来修复它们。)

4

0 回答 0