用于滞后于列的SQLite查询(和子查询)

时间:2015-03-05 13:46:30

标签: sql r sqlite

我有一个 SQLite myTable,有大约32亿条记录。随着时间的推移,它记录了公司中工人的身份(0或1)。同一个工人可以在不同的公司。该表如下所示:

companyID   workerID    timeVar     workerStatus
-------------------------------------
1           1           1           0
1           1           2           0
1           1           3           0
1           1           4           1
-------------------------------------
1           2           3           1
1           2           4           1
1           2           5           0
1           2           6           0
-------------------------------------
2           1           1           1
2           1           2           1
2           1           3           1
2           1           4           0
-------------------------------------
2           2           1           1
2           2           2           1
2           2           3           0
2           2           4           0
2           2           5           0
2           2           6           1
-------------------------------------

请注意,companyIDworkerIDtimeVar是关键。

我想创建两列:

  1. workerStatusMaxLag1会说明前一个workerStatus中的timeVar是否等于1.

  2. workerStatusMaxLag2会说明前两个workerStatus中的timeVar是否等于1。

  3. 要清楚,这就是我想要实现的目标:

    companyID   workerID    timeVar     workerStatus    workerStatusMaxLag1     workerStatusMaxLag2
    1           1           1           0               NULL                    NULL
    1           1           2           0               1                       1
    1           1           3           0               1                       1
    1           1           4           1               1                       1
    -----------------------------------------------------------------------------
    1           2           3           1               1                       1
    1           2           4           1               1                       1
    1           2           5           0               1                       1
    1           2           6           0               0                       1
    -----------------------------------------------------------------------------
    2           1           1           1               NULL                    NULL
    2           1           2           1               1                       1
    2           1           3           1               1                       1
    2           1           4           0               1                       1
    -----------------------------------------------------------------------------
    2           2           1           1               NULL                    NULL
    2           2           2           1               1                       1   
    2           2           3           0               1                       1
    2           2           4           0               1                       1
    2           2           5           0               1                       1
    2           2           6           1               0                       1
    -----------------------------------------------------------------------------    
    

    注意

    除了{{1对于公司x worker的每个组合,可以有所不同。

    我正在 R 工作,但鉴于我的数据太大,我认为如果单独使用SQL语句完成所有这些操作并且不加载(切片)数据,我会更安全进入 R

    我尝试了什么

    我是SQL的新手,我试图给出一些小步骤,但并没有走得太远。我认为构建查询的第一步是

    workerID

    因此我知道每个时期timeVar。然后我想把这个连接到桌子上,但首先我需要计算滞后。

    我看过,但没有走得太远。此外,可能有不同的方法,性能可能会有很大差异。虽然我不需要最高性能(我只会这样做一次),但我确实有一个非常沉重的表(32亿行,或100GB +表的数据),我只是不想要我的机器崩溃了(我在Windows 7上,16GB内存,英特尔i7-2600)。

1 个答案:

答案 0 :(得分:1)

您可以使用相关子查询表达查询。例如,获取以前的状态

select t.*,
       (select t2.status
        from myTable t2
        where t2.companyId = t.companyId and 
              t2.workerId = t.workerId and
              t2.timeVar < t.timeVar
        order by t2.timeVar desc
        limit 1
       ) 
from myTable t;

此查询确实需要索引:myTable(companyId, workerId, TimeVar, Status)

即使使用索引,对于如此复杂的查询,32亿行也相当大。我不知道SQLite是否会完成。