使用SQL将同一日期不同类别的价格合并到一个表中

使用SQL将同一日期不同类别的价格合并到一个表中,sql,google-bigquery,bigquery-standard-sql,Sql,Google Bigquery,Bigquery Standard Sql,我有一个关于20只股票的长表。股票符号是一个类别。例如,假设该表有:[Date,Close,Symbol],其中有20000行有20个不同的库存符号 |Date . |Close|Symbol| |2010-01-01|20.10|SPY| |2010-01-02|20.11|SPY| |2010-01-02|30.11|CWGIX| |2010-01-02|40.10|PG| |2010-01-03|32.10|CWGIX| |2010-01-04|41.10|PG| |2010-01-

我有一个关于20只股票的长表。股票符号是一个类别。例如,假设该表有:[Date,Close,Symbol],其中有20000行有20个不同的库存符号

|Date .    |Close|Symbol|
|2010-01-01|20.10|SPY|
|2010-01-02|20.11|SPY|
|2010-01-02|30.11|CWGIX|
|2010-01-02|40.10|PG|
|2010-01-03|32.10|CWGIX|
|2010-01-04|41.10|PG|
|2010-01-04|30.02|CWGIX|
问题是这些股票的起止日期都不同。如果我想找到在同一天发生的两支股票的收盘价,我目前必须运行:

SELECT
  spy.Date, cwgix.Close cwgix, spy.Close spy
FROM (
  SELECT DATE(Date) Date, Close FROM `mytable` WHERE Symbol = "CWGIX ORDER BY Date ASC) cwgix
JOIN (
  SELECT DATE(Date) Date, Close FROM `mytable` WHERE Symbol = "SPY" ORDER BY Date ASC) spy
ON
  cwgix.Date = spy.Date
这给了我:

|Date      |SPY  |CWGIX|PG   |
|2010-01-02|20.11|30.11|40.10|


我怎样才能为所有20只股票做到这一点?我认为有更好的方法来实现这一点。

下面是针对BigQuery标准SQL的

#standardSQL
SELECT Date,
  MAX(IF(Symbol = 'SPY', Close, NULL)) SPY,
  MAX(IF(Symbol = 'CWGIX', Close, NULL)) CWGIX,
  MAX(IF(Symbol = 'ABC', Close, NULL)) ABC,
  MAX(IF(Symbol = 'XYZ', Close, NULL)) XYZ
FROM `project.dataset.table`
GROUP BY Date  
你将需要尽可能多的符号在上面的脚本下面的行-这是你在你的问题中所说的20%

MAX(IF(Symbol = 'SymbolName', Close, NULL)) SymbolName,
我对两者都感兴趣

如果您只需要所有符号都有结束值的日期,您可以使用下面的

#standardSQL
SELECT * FROM (
SELECT DATE,
  MAX(IF(Symbol = 'SPY', Close, NULL)) SPY,
  MAX(IF(Symbol = 'CWGIX', Close, NULL)) CWGIX,
  MAX(IF(Symbol = 'PG', Close, NULL)) PG
FROM `project.dataset.table`
GROUP BY DATE) t
WHERE NOT TO_JSON_STRING(t) LIKE '%null%'  
您可以使用问题中的示例数据测试、播放上述内容,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT DATE '2010-01-01' DATE, 20.10 Close, 'SPY' Symbol UNION ALL
  SELECT '2010-01-02', 20.11, 'SPY' UNION ALL
  SELECT '2010-01-02', 30.11, 'CWGIX' UNION ALL
  SELECT '2010-01-02', 40.10, 'PG' UNION ALL
  SELECT '2010-01-03', 32.10, 'CWGIX' UNION ALL
  SELECT '2010-01-04', 41.10, 'PG' UNION ALL
  SELECT '2010-01-04', 30.02, 'CWGIX' 
)
SELECT * FROM (
SELECT DATE,
  MAX(IF(Symbol = 'SPY', Close, NULL)) SPY,
  MAX(IF(Symbol = 'CWGIX', Close, NULL)) CWGIX,
  MAX(IF(Symbol = 'PG', Close, NULL)) PG
FROM `project.dataset.table`
GROUP BY DATE) t
WHERE NOT TO_JSON_STRING(t) LIKE '%null%'   
结果

Row DATE        SPY     CWGIX   PG   
1   2010-01-02  20.11   30.11   40.1     

提供一些样本数据和预期产出-因此我们实际上可以帮助您:您想要交叉产品还是希望每个股票都在同一张表中?我希望每个日期都有一行,每个股票都有一个收盘价,我很确定这是一个交叉产品。这意味着没有NaN或空行,但我对两种方法都感兴趣。酷-所以我必须修复列,我不能从project.dataset.table中选择不同的符号,但这是一个聪明的解决方案。现在还不清楚——请澄清——你是否只想要所有股票(而不仅仅是一些股票)都有收盘价的日期?我对两者都感兴趣。此解决方案和行具有一组完整的结束值的解决方案。对不起,我不太清楚。我也很好奇为什么我会收到None和NaN的回复,例如:Date G_Fund F_Fund S_Fund I_Fund C_Fund CCWAX CWGIX CWIAX PRRCX 0 1970-01-02 None NaN关闭列的数据类型是什么?