我有一个中等大小的数据库,有许多联接和查找表.
我更熟悉R而不是SQL,而且我正在使用MySQL.
我的问题是:
在什么情况下,为了支持R中的数据子设置功能(例如,merge
、*apply
、maply
、dlply
等)而停止增加SQL语句的复杂性是有益的.
一方面,SQL的连接比 Select 每个表的所有内容并使用Rmerge
函数连接它们更容易.此外,在SQL中执行条件 Select 将减少必须导入到R的数据量;但是速度差别并不大.
另一方面,具有复杂WHERE子句的大连接比R语法更不容易理解.
下面我有大约untested个代码用于说明目的:我在没有工作代码之前问这个问题,我的问题的答案不需要工作代码(尽管这总是受到赞赏)-"最优雅的方法"、"最少的行"或"令人惊叹的X实现"总是受到赞赏,但我特别感兴趣的是"最合理/最实用/最规范/基于基本原则"的基本原理.
我感兴趣的是,哪些步骤应该使用SQL where
子句,哪些步骤使用R更容易完成.
插图:
数据库描述
共有三张表:a
、ab
和b
.表a
和b
各有一个主键id
.它们有一个由查找表ab
表示的多对多关系,该表包含分别连接到a.id
和b.id
的字段ab.a_id
和ab.b_id
.两个表都有time
字段,a有group
字段.
目标:
下面是一个我想做的联接和子集的最小示例;
(MySQL元素命名,例如a.id
相当于R中的a$id
)
-
使用
ab
连接表a
和b
,将与每个a.id
相关联的多个b.time
值作为一个新列追加;select a_time, b.time, a.id, b.id from a join ab on a.id = ab.a_id join b on b.id = ab.b_id and then append b.time for distinct values of b.id;
-
我不需要重复的b值.时间,我只需要一个值
b.max
:对于每个a.id
的重复值b.time
,b.max
是b.time
最接近但不大于a.time
的值b.max <- max(b.time[b.time < a.time))
- 将值
dt <- a.time - b.max
附加到表中,例如,在R中, -
对于
a.group
中的每个不同值, Select 哪个(min(x.dt))x.dt <- a.time - b.max