我正在尝试优化以下查询。
SELECT t3.*,
(SELECT SUM(t4.col_sum)
FROM (...) t4
WHERE t4.timestamp BETWEEN CONCAT(SUBSTR(t3.timestamp, 1, 11), "00:00:00") AND t3.timestamp)
AS cum_sum
FROM (...) t3
其中(...)是长查询的容器。它产生2列:timestamp和col_sum。我想通过编写查询来添加第三列。第三列是col_sum的累积和。
问题是我在两个地方放置相同的大查询(...)
有没有办法可以获得结果并在两个/多个地方使用结果(...)?
答案 0 :(得分:1)
一种方法是使用临时表。
可能更有效的方法是使用变量来计算累积总和。它会是这样的:
select t.*,
(@c := if(@t = left(t.timestamp, 11), @c + t.col_sum,
if(@t := left(t.timestamp, 11), 0, 0)
)
) as cumesum
from (. . .) t cross join
(select @t := '', @c := 0) vars
order by t.timestamp;
上述查询按timestamp
对行进行排序。变量@t
跟踪时间戳中的前11个字符 - 当我读取您的逻辑时,您希望仅在不变的组中进行累积求和。
变量@c
跟踪累积总和,当遇到新的“前11个字符”时重置为零。逻辑看起来有点复杂,但最好将所有变量赋值放在一个表达式中,因为MySQL不保证表达式的求值顺序。