我有这个查询,这是解释:https://explain.depesz.com/s/ctSQ
SELECT
current_day,
SUM(daily_holdings_eur) as value_eur
FROM (
SELECT
DATE(days) AS current_day,
ts.coin_id,
GREATEST(0, SUM(ha.value_eur)) AS daily_holdings_eur
FROM
GENERATE_SERIES (
CURRENT_DATE - '2 DAY' :: INTERVAL,
CURRENT_DATE,
'1 DAY' :: INTERVAL
) days
LEFT JOIN transaction_summaries ts ON ts.user_id = 1 AND DATE(ts.trade_at) <= days
CROSS JOIN LATERAL (
SELECT price_eur * ts.quantity AS value_eur
FROM historical_data
WHERE coin_id = ts.coin_id
ORDER BY DATE(days)<->snapshot_on
LIMIT 1
) AS ha
GROUP BY days, ts.coin_id
) final
GROUP BY final.current_day
ORDER BY final.current_day
您可以看到问题出在FROM historical_data
。
我在这里要做的是:
transaction_summaries
,这是一个视图)直到那天(重复多次)CROSS JOIN LATERAL
上的historical_data
横向获取当天硬币的最佳历史价格,我直接在其中使用乘法并在外部选择中求和。此查询目前非常昂贵,因为我找不到重用计算数据或其他任何方法的方法。
transaction_summaries
COIN_ID | QUANTITY | TRADE_AT | USER_ID
--------|----------|-------------------------|--------
1 | -500.0 | 2018-01-13 13:15:58 | 751
historical_data
ID | COIN_ID | SNAPSHOT_ON | PRICE_EUR
---|---------|-------------|----------
1 | 1 | 2017-10-07 | 0.66
2 | 2 | 2017-10-07 | 0.68
3 | 3 | 2017-10-07 | 0.13
4 | 4 | 2017-10-07 | 1.0
这是针对最近7天的投资组合价值,我汇总了截至每天所做的所有交易,并将数量转换为最接近交易snapshot_on
的历史价格trade_at
。
感谢任何提示。