经过无休止的尝试来处理R中的大型(3-35gb)csv文件后,我已转向使用SQL处理这些数据集。因此,我在R环境中使用此代码(使用基于SQlite的RSQLite程序包),但它不应减损我的SQL问题!
我的问题:如何根据另一个表中给出的匹配值来选择一个表?
我想举例说明。我有以下表格格式:
“数据”表
Symbol| Value| EX
A | 1 | N
A | 1 | N
A | 2 | T
A | 3 | N
A | 4 | N
A | 5 | N
B | 1 | P
B | 2 | P
B | 2 | N
B | 2 | N
B | 3 | P
B | 5 | P
B | 6 | T
...
我想根据下表示例表中给出的特定条件选择符号和交换值匹配的所有条目。
“ Symbolexchange”表:
Ticker| Exchange
A | N
B | P
...
(请注意,符号和股票代码指的是同一属性,EX和Exchange指的是同一属性)
所以我的目标输出是,在交换为N等情况下,它仅保留A项:
Symbol| Value| EX
A | 1 | N
A | 1 | N
A | 3 | N
A | 4 | N
A | 5 | N
B | 1 | P
B | 2 | P
B | 3 | P
B | 5 | P
...
尽管我对它们不满意,但我可以通过两种方法做到这一点。
此方法将引用表添加到原始表旁边的列中,这是多余的。
SELECT *
FROM Data
INNER JOIN Symbolexchange
ON Data.EX=Symbolexchange.EXCHANGE
AND Data.SYMBOL=Symbolexchange.TICKER
此方法也可以直接完成工作,但比上述方法慢。
SELECT *
FROM Data
WHERE EX=(SELECT exchange FROM Symbolexchange WHERE ticker = SYMBOL)
有没有更好,更快的方法对此进行编程?由于数据集的大小,速度非常重要。欢迎对我的代码发表任何其他评论!
谢谢
您可以做两件事来提高性能:
首先(也是最重要的)向表中添加键或索引。我不知道SQLite,但通常有这样的命令:
CREATE INDEX DataIX1 ON Data(Symbol,EX)
您也会在另一个桌子上想要一个:
CREATE INDEX SymbolExchangeIX1 ON Symbolexchange(Ticker,Exchange)
您可能需要在名称上加上“ ..”或“ ..” ...
第二件事是,尽管您的第一个查询可能是最好的方法,但是您应该只返回您实际需要/想要的列:
SELECT Data.*
FROM Data
INNER JOIN Symbolexchange
ON Data.EX=Symbolexchange.EXCHANGE
AND Data.SYMBOL=Symbolexchange.TICKER
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句