使用 SQL 将同一日期不同类别的价格合并为一个 table
Combine prices from different categories on the same date in one table using SQL
我有一只多头 table 股票 returns 大约有 20 只股票。股票代码是一个类别。例如,假设 table 具有:[Date, Close, Symbol],其中有 20,000 行具有 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,
I'm interested in both
如果您只需要所有符号都具有收盘价的日期 - 您可以使用下面的
#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
我有一只多头 table 股票 returns 大约有 20 只股票。股票代码是一个类别。例如,假设 table 具有:[Date, Close, Symbol],其中有 20,000 行具有 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,
I'm interested in both
如果您只需要所有符号都具有收盘价的日期 - 您可以使用下面的
#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