我有一个 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
-------------------------------------
请注意,companyID
,workerID
,timeVar
是关键。
我想创建两列:
workerStatusMaxLag1
会说明前一个workerStatus
中的timeVar
是否等于1.
workerStatusMaxLag2
会说明前两个workerStatus
中的timeVar
是否等于1。
要清楚,这就是我想要实现的目标:
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)。
答案 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是否会完成。