Big_Table拥有数百万条记录。 Little_Table是一个将重新格式化和导入的电子表格,有大约25,000条记录。这些表共享一些需要匹配的常见且相似但表达不同的列,它们是:
Big_Table
SPY20170602PUT241, 2017-06-01 09:21:20.107, 09:21:00.935
Little_Table
SPY20170602PUT241, 6/1/2017, 9:21:00
目标是从Big_Table中检索匹配* Little_Table的记录。为此,我需要指导,如果有必要,构建/重新格式化一些Little_Table列,然后进行查询以完成工作。请指教。 *匹配是这三个标准对于每个表中的一行是真实的:
- instr and instrument are the same exact string
- date and Date indicate the same mm/dd/yyyy
- ts and time indicate the same hh/mm/ss
答案 0 :(得分:0)
根据我的理解,这是对多个conditios的简单连接,请尝试以下示例:
SELECT * FROM Big_Table JOIN Little_Table ON (instr=instrument AND date=Date AND ts=time) WHERE ....
答案 1 :(得分:0)
这对我有用。我使用自定义列 trade_name 创建了一个新的Big_Table修改版本。我使用自定义列 trade_name 创建了Little_Table,专门用于匹配。我怀疑这是最好的解决方案,但它确实奏效了。以下是详细信息:
* trade_name ,工程专栏,将最初不匹配格式的三个匹配标准和每个表中的单独列组合成一个 格式化规范化,连接字符串(日期+时间+仪器)。即对于每个表格,将表示日期,时间和工具的列连接到 trade_name 列,格式相同。
创建Big_Table_New:我使用了Big_Table的CREATE TABLE语句,称之为" Big_Table_New",删除了键,添加了列"商品名" ,使其成为表的索引,然后使用以下语句填充数据:
INSERT INTO Big_Table_New
SELECT *, CONCAT_WS(' | ',instr,DATE(date),TIME_FORMAT(ts,'%T'))
FROM Big_Table
WHERE date>='2017-06-01 00:00:00' AND date<'2017-06-02 00:00:00'
AND instr IN (SELECT instrument FROM instruments);
我只需要2017年6月份的记录,作为解决方法,我在每月的每一天重复查询一次,而不是一次性选择整个月,因为查询已经超时了特别是六月的一天。继续......
创建Little_Table:首先,我使用CREATE TABLE Little_Table语句来创建表模式。我为trade_name包含了一个列,并将其作为索引。然后我加载了csv文件,使用SET在同一步骤中对trade_name应用格式修改和连接。
LOAD DATA LOCAL INFILE 'C:\\myfilepath\\Little_File.csv'
INTO TABLE Little_Table
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(l_instr, @l_date, @l_ts, l_prc, l_side, l_qty, trade_name)
SET
l_date = DATE_FORMAT(STR_TO_DATE(@l_date, '%m/%d/%Y'), '%Y-%m-%d'),
l_ts = TIME_FORMAT(DATE_SUB(STR_TO_DATE(@l_ts, '%H:%i:%s'), INTERVAL 1 HOUR),'%T'),
trade_name = CONCAT_WS(' | ',l_instr,l_date,l_ts);
最终查询使用了以下语句:
SELECT *
FROM Big_Table_New, Little_Table_New
WHERE Big_Table_New.`trade_name` = Little_Table_New.`trade_name`;
查询耗时约150秒,这已经足够了。