【问题标题】:Can a local dataframe be accesses from a SQL chunk in R Markdown可以从 R Markdown 中的 SQL 块访问本地数据帧吗
【发布时间】:2021-12-06 21:41:47
【问题描述】:

我已运行 SQL 语句并将结果存储在本地数据框中 称为“测试”,`{sql connection=Prod, output.var="test"}。

现在,我需要在另一个 R SQL 块中“测试”本地数据帧,这可能吗?


     SELECT COUNT(*) AS 'RecordCount'
         , EMPD
         , Department 

     FROM "test"
     GROUP BY EMPD
         , Department
         

【问题讨论】:

    标签: sql r


    【解决方案1】:

    一般不会。您连接的 SQL 数据库服务器对您的 R 会话一无所知,因此无法处理您的 R 数据。

    sqldf 包允许您通过创建本地数据库在 R 对象上使用 SQL。如果您使用 SQL 比使用 R 更自如,或者如果您想做一些在 SQL 中比在 R 中更容易的事情,那么这是一个很好的解决方案。

    在大多数情况下,运行 SQL 查询并将结果存储在 R 中的目的是在接下来的步骤中使用 R,而不是 SQL。您的示例 SQL 代码可以像这样转换为 dplyr

    library(dplyr)
    count(test, EMPD, Department, name = "RecordCount")
    

    如果您需要在新 SQL 查询中引用结果,例如与数据库中的另一个表进行联接,最佳解决方案将取决于您的用例、您使用的 SQL 数据库的风格以及结果有多大。您可以使用一个大的 SQL 查询而不是两个小的 SQL 查询,或者将中间结果写入一个临时表。

    【讨论】:

    • 我试图翻译一个使用多个“临时”表的大型 SQL Server 语句,但无法从 RStudio 中的 SQL 块中获取数据以写入 SQL Server 临时表。这就是我分离查询并将结果存储在本地作为临时表的原因。一些查询连接来自 SQL 服务器的表和临时表(在我的情况下存储在本地),这就是为什么我有兴趣从 SQL 块访问本地存储的数据帧。不知道为什么 INTO #temp 语句在 SQL 块中似乎没有效果,但在 SQL 服务器中运行时却可以正常工作。
    • 这些都是非常相关的信息,可以很好地包含在新问题中。 “为什么从 R 连接时我的 select into #temp statements 不起作用?”搜索该问题came up with this question 可能会有所帮助。公用表表达式可能是一个很好的解决方法。
    • 是不是因为select into #temp是一个本地临时表,调用连接一关闭就被收割?
    • 大约 10 年前,我记得一个类似的问题,甚至在单个语句中使用临时表也失败了。我认为 Chris Gheen 的 answer here 可能会这样做——它说 RODBC 默认情况下会在执行第一个临时表语句时认为查询已完成,但提供了一个关闭它的选项。
    • 这是一个有趣的前提。我一直认为临时表的生命周期是由 DBMS 规定的,而不是由连接本身规定的。也就是说,如果由于某种原因RODBCDBI/odbc 硬失败,那么临时表仍然会消失,尽管 ODBC 客户端自身无法正确清理。如果RODBC 正在解决这个问题,那么......听起来它可能会干预临时表操作,考虑到有些需要临时表是#-领先,这可能很困难,而其他人则不需要,所以不是总是清楚哪个是哪个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多