Агрегация данных SQL - Преобразование строк в столбцы - Таблица с миллиардами строк - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть миллиарды строк в таблице. Просто вставляю пример данных.

ticker     trade_date          trade_time     Price      Volume
---------------------------------------------------------------
AKS         01242017             1025           9.995    75038
AKS         01242017             1030          10        86891
AKS         01242017             1031           9.97     52815
AKS         01242017             1036          10.03     83556
AKS         01242017             1037          10.05     92644

Я хочу суммировать данные по торговым часам. Обычные часы NYSE с 09:30 до 1600:00.

Я хочу видеть вышеуказанные данные следующим образом

ticker    tdate        1sthour       Avg Price        2nd hour   Avg price
---------------------------------------------------------------------------
AKS        01242017     161929          9.99            229015     10.02

Проблема в том, что у меня есть 42000 разных тикеров, и большинство тикеров могут не иметь данных за каждый час. В таких случаях я хочу, чтобы 0 отображалось для часа, в который нет продажи акций. Пробный случай с суммой, но результат выглядит не очень хорошо.

Объем рассчитывается следующим образом: 1-й час 930 - 1030 = 75038 + 86891 = 169129 Средняя цена = (75038 * 9,995 + 86891 * 10) / (75038 + 86891)

1 Ответ

0 голосов
/ 01 ноября 2018

Я думаю, что это будет делать то, что вы хотите:

select ticker, tdate,
       sum(case when tradetime >= '0930' and tradetime <= '1030' then volume else 0 end) as volume_1,
       avg(case when tradetime >= '0930' and tradetime <= '1030' then price end) as price_1,
       sum(case when tradetime > '1030' and tradetime <= '1130' then volume else 0 end) as volume_2,
       avg(case when tradetime >= '1030' and tradetime <= '1130' then price end) as price_2,
       . . . 
from t
group by ticker, tdate ;
...