Как дополнить результаты запроса SQLite - PullRequest
0 голосов
/ 24 января 2019

У меня есть очень простая база данных SQLite с ежедневной ценовой историей со следующей схемой:

CREATE TABLE OHLCV_Components (symbol TEXT, tradeDate TEXT, openPrice REAL, highPrice REAL, lowPrice REAL, closePrice REAL, volume INTEGER)

Цены указаны в базе данных только для дат, в которые существуют данные для этой комбинации символ / дата. Я строю запрос через Matlab, чтобы вернуть таблицу всех символов с ценовыми данными для данного диапазона дат:

SELECT symbol, 
       tradeDate, 
       closePrice 
FROM OHLCV_Components 
WHERE tradeDate BETWEEN DATE('2000-01-01') AND DATE('2000-01-05') 
ORDER BY symbol ASC, tradeDate ASC

-------------------------------------
symbol       tradeDate     closePrice
-------------------------------------
A            2000-01-01       10.1 
A            2000-01-02       10.3 
A            2000-01-03       10.3 

B            2000-01-01        5.1 
B            2000-01-02        5.5 

C            2000-01-01       20.9 
C            2000-01-02       20.8 
C            2000-01-05       20.7 

D            2000-01-01       25.9 
D            2000-01-02       25.8 
D            2000-01-03       25.8 
D            2000-01-05       25.7 

Желательно, чтобы каждый символ в таблице имел длину, равную самой длинной непрерывной записи даты в запрошенном диапазоне дат (в данном случае символ D); то есть символам с отсутствующими ценовыми данными за данный день присваиваются значения NULL:

-------------------------------------
symbol      tradeDate      closePrice
-------------------------------------
A           2000-01-01        10.1 
A           2000-01-02        10.3 
A           2000-01-03        10.3
A           2000-01-05        NULL

B           2000-01-01        5.1 
B           2000-01-02        5.5 
B           2000-01-03        NULL
B           2000-01-05        NULL

C           2000-01-01        20.9 
C           2000-01-02        20.8 
C           2000-01-03        NULL
C           2000-01-05        20.7 

D           2000-01-01        25.9 
D           2000-01-02        25.8 
D           2000-01-03        25.8 
D           2000-01-05        25.7 

Можно ли переложить эту задачу на эффективный запрос SQLite, вместо того, чтобы обращаться к нему программно, что может быть мучительно медленным для больших запросов?

1 Ответ

0 голосов
/ 24 января 2019

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

SELECT y.symbol,
       x.tradedate,
       o.closeprice
       FROM (SELECT DISTINCT
                    tradedate
                    FROM ohlcv_components
                    WHERE tradedate BETWEEN date('2000-01-01')
                                            AND date('2000-01-05')) x
            CROSS JOIN (SELECT DISTINCT
                               symbol
                               FROM ohlcv_components
                               WHERE tradedate BETWEEN date('2000-01-01')
                                                       AND date('2000-01-05')) y
            LEFT JOIN ohlcv_components o
                      ON o.tradedate = x.tradedate
                         AND o.symbol = y.symbol
       ORDER BY y.symbol ASC,
                x.tradedate ASC;

Для производительности может подойти индекс ohlcv_components(tradedate, symbol).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...