如何在dplyr中使用dbplyr执行GROUP BY ... HAVING查询?
我有一个ID列表,我必须按不在此列表中的ID进行分组。
如果没有,我可以用tbl()
直接执行查询吗?dplyr谓词是什么?
使用dplyr中的group_by_if
函数似乎没有实现。
我想执行
SELECT * FROM TBL
WHERE YEAR(DATE) = 2001
GROUP BY COL1 HAVING COL2 NOT IN ID_LIST
其中ID_LIST
是R向量
答案 0 :(得分:1)
对于您给出的示例,我不清楚如何实现
SELECT * FROM TBL
WHERE YEAR(DATE) = 2001
GROUP BY COL1
HAVING COL2 NOT IN ID_LIST
不同于
SELECT * FROM TBL
WHERE YEAR(DATE) = 2001
AND COL2 NOT IN ID_LIST
GROUP BY COL1
因此,@ Rohit建议使用过滤器是一种有效的解决方案。
HAVING
的操作方式与WHERE
大致相同,但是在添加了附加功能后,您可以在HAVING
子句中使用聚合器。参见this discussion。但是在这种情况下,您不会在HAVING
子句中应用聚合器,因此您应该可以随意使用WHERE
子句。
关于dbplyr产生的嵌套SQL查询。鉴于通常强调干净的,可读性强的代码,这似乎有点违反直觉,但是对于dbplyr自动生成的查询,我建议不要担心机器生成的代码的质量。它是由机器编写的,并且(通常)是由机器读取的,因此它的可读性不太重要。
效率可能与许多嵌套层有关。但是,在2017-06-09中,为dbplyr提供了基本的SQL优化器。我还没有发现(尽管我还没有进行广泛的测试)嵌套自动生成的查询要比未嵌套的用户编写的查询的性能明显差。但是,如果性能至关重要,则您可能希望通过paste
将R中的文本字符串组合在一起来手动构建SQL查询。
一个最后的想法-ID_LIST
的长度也很重要。在this问题中进行了讨论。