Объедините цены из разных категорий на одну и ту же дату в одну таблицу, используя SQL - PullRequest
1 голос
/ 21 апреля 2019

У меня есть одна длинная таблица возвратов акций примерно для 20 акций.Символ акции - это категория.Например, предположим, что в таблице есть: [Дата, Закрытие, Символ], где имеется 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 акций?Я думаю, что есть лучший способ сделать это.

1 Ответ

1 голос
/ 21 апреля 2019

Ниже для BigQuery Standard 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,

Я заинтересован в обоих

Если вам нужны ТОЛЬКО даты, когда ВСЕ символы имеют значение Close - вы можете использовать ниже

#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     
...