Вопрос несколько связан с моим предыдущим Заполните пропущенные значения для объединенных таблиц в BigQuery .
В основном у меня есть 2 таблицы.Один с акциями, другой с ценами на акции.Цель состоит в том, чтобы иметь таблицу, в которой для каждого дня, для которого есть цена, рассчитывается стоимость.На это был дан ответ в предыдущем вопросе.(Выполните CROSS JOIN и ARRAY_AGG, чтобы заполнить недостающую сумму на дату, когда существует цена акции, но транзакции не было).
Теперь, если я хочу добавить другие значения, такие как «текущая сумма / баланс», то результат будет поврежден, в основном, каждая строка удваивается (дата и символ акции), так как я добавляю другое поле (running_amount) в секционированный (что я должен сделать).На этом мое понимание SQL заканчивается :), поэтому я буду признателен за любую помощь или предложение.Цель состоит в том, чтобы иметь одну строку на дату и символ акций.
Вот полный пример запроса:
WITH `trans` AS (
SELECT DATE '2018-10-02' trans_date, 10.0 stock_amount, 'TX' stock_symbol UNION ALL
SELECT DATE '2018-10-03', 5.0, 'TX' UNION ALL
SELECT DATE '2018-10-05', 11.0, 'AX' UNION ALL
SELECT DATE '2018-10-10', 10.0, 'AX'
),
`prices` AS (
SELECT DATE '2018-10-01' price_date, 1.0 price, 'TX' symbol UNION ALL
SELECT DATE '2018-10-02', 2.0, 'TX' UNION ALL
SELECT DATE '2018-10-03', 3.0, 'TX' UNION ALL
SELECT DATE '2018-10-04', 4.0, 'TX' UNION ALL
SELECT DATE '2018-10-05', 5.0, 'TX' UNION ALL
SELECT DATE '2018-10-06', 6.0, 'TX' UNION ALL
SELECT DATE '2018-10-07', 7.0, 'TX' UNION ALL
SELECT DATE '2018-10-08', 8.0, 'TX' UNION ALL
SELECT DATE '2018-10-08', 8.0, 'AX' UNION ALL
SELECT DATE '2018-10-09', 9.0, 'TX' UNION ALL
SELECT DATE '2018-10-09', 9.0, 'AX' UNION ALL
SELECT DATE '2018-10-10', 10.0, 'TX' UNION ALL
SELECT DATE '2018-10-10', 10.0, 'AX' UNION ALL
SELECT DATE '2018-10-11', 11.0, 'TX' UNION ALL
SELECT DATE '2018-10-11', 11.0, 'AX' UNION ALL
SELECT DATE '2018-10-12', 11.0, 'AX' UNION ALL
SELECT DATE '2018-10-12', 12.0, 'TX'
)
SELECT
price_date,
tx.stock_symbol AS token_symbol,
IFNULL(
ARRAY_AGG(
IF(p.price_date >= tx.trans_date AND p.symbol = tx.stock_symbol, stock_amount, NULL)
IGNORE NULLS ORDER BY trans_date DESC LIMIT 1
)[OFFSET(0)],
-1234567890) stock_amount,
running_amount,
price
FROM (
SELECT
trans_date,
stock_symbol,
stock_amount,
SUM(stock_amount) OVER (PARTITION BY stock_symbol ORDER BY trans_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_amount
FROM `trans`
ORDER BY stock_symbol, trans_date
)
AS tx
CROSS JOIN `prices` as p
GROUP BY price_date, price, token_symbol
,running_amount
HAVING stock_amount != -1234567890
ORDER BY stock_symbol, price_date
Ожидается такой результат:
Row price_date token_symbol stock_amount running_amount price
1 2018-10-08 AX 11 11 8
2 2018-10-09 AX 11 11 9
3 2018-10-10 AX 10 21 10
4 2018-10-11 AX 10 21 11
5 2018-10-12 AX 10 21 11
6 2018-10-02 TX 10 10 2
7 2018-10-03 TX 5 15 3
8 2018-10-04 TX 5 15 4
9 2018-10-05 TX 5 15 5
10 2018-10-06 TX 5 15 6
11 2018-10-07 TX 5 15 7
12 2018-10-08 TX 5 15 8
13 2018-10-09 TX 5 15 9
14 2018-10-10 TX 5 15 10
15 2018-10-11 TX 5 15 11
16 2018-10-12 TX 5 15 12