[英]MySQL calculated column lagged return
我有一個MySQL查詢,其中有一個計算列。
由於某種原因,第一次運行時,查詢在計算列中返回NULL。 刷新(即第二次運行)時,它將正確返回計算值。 我如何擺脫這種滯后?
請參閱以下查詢:
SELECT @P0:=MAX(CASE WHEN t2.date IS NULL THEN t1.price ELSE NULL END),
@P1:=MAX(CASE WHEN t3.date IS NULL THEN t1.price ELSE NULL END),
ROUND(100*(@P1-@P0)/@P0,1) AS 'r1y'
/* The r1y above is the calculated column that is returned with lag*/
FROM (SELECT date, price FROM mytable
WHERE ticker='XYZ'
AND date>=@t1:=(SELECT DATE_SUB((SELECT MAX(date) FROM mytable),
INTERVAL 1 YEAR))) AS t1
LEFT OUTER JOIN (SELECT date FROM mytable
where ticker='XYZ'
AND date>=@t1) AS t2
ON (t1.date>t2.date)
LEFT OUTER JOIN (SELECT date FROM mytable
WHERE ticker='XYZ'
AND date>=@t1) AS t3
ON (t1.date<t3.date)
當我將“ r1y”的計算結果從MySQL移到代碼的PHP部分時,當然沒有滯后。 盡管如此,最好將所有計算都包含在MySQL中。
這是更簡單的查詢,它沒有延遲地返回相同的結果(執行時間大致相同):
SELECT
@d1:=(SELECT MAX(date) FROM mytable WHERE ticker='XYZ' AND current=1),
@d2:=(SELECT MIN(date) FROM mytable WHERE ticker='XYZ'
AND date>=DATE_SUB(@d1, INTERVAL 1 YEAR)),
@m1:=(SELECT price FROM mytable WHERE ticker='XYZ' AND date=@d1),
@m2:=(SELECT price FROM mytable WHERE ticker='XYZ' AND date=@d3),
ROUND(100*(@m1-@m2)/@m2, 1) as r1y
了解上述滯后的性質仍然會很好,但是此建議的解決方案對我來說很好。
您在此處設置@ t1的值:
FROM (SELECT date, price
FROM mytable
WHERE ticker='XYZ' AND
date>=@t1:=(SELECT DATE_SUB((SELECT MAX(date) FROM mytable
), INTERVAL 1 YEAR
)
)
) AS t1
然后,您將在后續的子查詢中使用它。
SQL 不保證連接處理順序。 MySQL也沒有。 您的查詢第一次不起作用的原因是因為沒有先執行第一個子查詢。
可能最簡單的解決方法是在原始查詢的每個部分中重復子查詢-但請確保在date
上有一個索引,以便快速評估。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.