我有一个中等大小的数据库,有许多联接和查找表.

我更熟悉R而不是SQL,而且我正在使用MySQL.

我的问题是:

在什么情况下,为了支持R中的数据子设置功能(例如,merge*applymaplydlply等)而停止增加SQL语句的复杂性是有益的.

一方面,SQL的连接比 Select 每个表的所有内容并使用Rmerge函数连接它们更容易.此外,在SQL中执行条件 Select 将减少必须导入到R的数据量;但是速度差别并不大.

另一方面,具有复杂WHERE子句的大连接比R语法更不容易理解.

下面我有大约untested个代码用于说明目的:我在没有工作代码之前问这个问题,我的问题的答案不需要工作代码(尽管这总是受到赞赏)-"最优雅的方法"、"最少的行"或"令人惊叹的X实现"总是受到赞赏,但我特别感兴趣的是"最合理/最实用/最规范/基于基本原则"的基本原理.

我感兴趣的是,哪些步骤应该使用SQL where子句,哪些步骤使用R更容易完成.

插图:

数据库描述

共有三张表:aabb.表ab各有一个主键id.它们有一个由查找表ab表示的多对多关系,该表包含分别连接到a.idb.id的字段ab.a_idab.b_id.两个表都有time字段,a有group字段.

目标:

下面是一个我想做的联接和子集的最小示例;

(MySQL元素命名,例如a.id相当于R中的a$id)

  1. 使用ab连接表ab,将与每个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;
    
  2. 我不需要重复的b值.时间,我只需要一个值b.max:对于每个a.id的重复值b.timeb.maxb.time最接近但不大于a.time的值

    b.max <- max(b.time[b.time < a.time))
    
  3. 将值dt <- a.time - b.max附加到表中,例如,在R中,
  4. 对于a.group中的每个不同值, Select 哪个(min(x.dt))

    x.dt <- a.time - b.max
    

推荐答案

我通常用SQL进行数据操作 直到我想要的数据出现在单个表中, 然后,我用R音跳睡觉. 仅当存在性能问题时 我是否要开始将一些计算移到数据库中. 这已经是您正在做的事情了.

涉及时间戳的计算通常 在SQL中变得不可读 ("analytic functions",类似于ddply, 应该可以简化这一过程, 但我认为它们在MySQL中是不可用的).

然而,您的示例可能完全可以用SQL编写,如下所示(未经测试).

-- Join the tables and compute the maximum
CREATE VIEW t1 AS
SELECT a.id    AS a_id, 
       a.group AS a_group,
       b.id    AS b_id,
       a.time  AS a_time, 
       a.time - MAX(b.time) AS dt
FROM   a, b, ab
WHERE  a.id = ab.a_id AND b.id = ab.b_id
AND    b.time < a.time
GROUP  BY a.id, a.group, b.id;

-- Extract the desired rows
CREATE VIEW t2 AS 
SELECT t1.*
FROM t1, (SELECT group, MIN(dt) AS min_dt FROM t1) X
WHERE t1.a_id = X.a_id 
AND   t1.b_id = X.b_id 
AND   t1.a_group = X.a.group;

Database相关问答推荐

更新数据后,TableView停止按搜索栏进行筛选

如何将使用模块创建的 Redis RDB 文件迁移到没有该模块的部署? (RedisStack 版本 7.2+ 中不再包含 RedisGraph)

DynamoDB 扫描 - 具有相同分区键的项目按顺序返回

是否可以同时从 RocksDB 读取?

utf-8 与 latin1

add_index 到数据模型 - Ruby on Rails 教程

使用 Laravel 5.2 从存储在 Y-m-d 数据库中的日期计算年龄

db:schema:load vs db:migrate with capistrano

为什么String or Binary data would be truncated不是更具描述性的错误?

行之间的 SQL 差异

如果数据库已经提供缓存,为什么还要使用应用程序级缓存?

具有多列的单个固定表与灵活的抽象表

从 CSV 文件填充 Android 数据库?

日期格式的 Oracle SQL 查询

多个和单个索引

Django:检测数据库后端

与 IntelliJ IDEA 相比,DataGrip 附加值

数据库 - (行或记录、列或字段)?

LevelDB 支持 java 吗?

有任何使用协议缓冲区的经验吗?