Кажется, это какая-то ошибка или «особенность» MySQL. Многие люди, похоже, имеют ту же проблему с внешними таблицами, находящимися вне области видимости.
В любом случае ... Вы можете создавать функции, которые извлекают нужную информацию:
DROP FUNCTION IF EXISTS AveragePriceHistory_20;
CREATE FUNCTION AveragePriceHistory_20(MyTickerID INT)
RETURNS DECIMAL(9,2) DETERMINISTIC
RETURN (
SELECT AVG(Y.Close)
FROM (
SELECT Z.Close
FROM equity_pricehistory_daily Z
WHERE Z.TickerID = MyTickerID
ORDER BY Timestamp DESC
LIMIT 20
) Y
HAVING COUNT(*) = 20
);
SELECT
E.TickerID,
E.Ticker,
AveragePriceHistory_20(E.TickerID) AS MA20
FROM equity E;
Вы получите NULL
вместо -1
. Если это нежелательно, вы можете заключить вызов функции в IFNULL(...,-1)
.
Другим способом решения этой проблемы будет выбор периода времени вместо использования LIMIT
.
SELECT
E.TickerID,
E.Ticker,
(
SELECT AVG(Y.Close)
FROM equity_pricehistory_daily Y
WHERE Y.TickerID = E.TickerID
AND Y.Timestamp > ADDDATE(CURRENT_TIMESTAMP, INTERVAL -20 DAY)
) AS MA20
FROM equity E;