在mysql中使用临时表规范化数据

p4tfgftt  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(403)

我有一个带有权重的表,我想在mysql中重新规范化它。当我尝试将表连接到依赖于自身的内联查询时,会出现“cannotreopentable”错误,当我尝试使用cte时,也会出现同样的错误。下表示例:
重量

monthEnd, portName, ticker, wgt
2019-04-30, test, MTUM, 0.20451060987312306
2019-04-30, test, SIZE, 0.20763723114425484
2019-04-30, test, USMV, 0.2043537465059284
2019-04-30, test, QUAL, 0.20758892877605561
2019-04-30, test, VLUE, 0.20683696239330326

我想做如下的事情来重新规范化 wgt 列(即,总和(wgt)=1):

select a.monthEnd, ticker, wgt/totWgt 
from weights a
inner join ( 
            select monthEnd, sum(wgt) as totWgt
            from weights
            group by monthEnd ) tot
            on a.monthEnd = tot.monthEnd

但我收到一条错误信息,表明:

Error Code: 1137. Can't reopen table: 'a'

当我尝试使用cte而不是临时表来执行此操作时,会收到相同的消息,这似乎是mysql中的一个已知问题。
只要我需要weights表来计算总权重,我尝试做的唯一可能的方法就是创建另一个临时表来保存总权重,并将我的weights表连接到它来进行规范化。
在mysql 8.0中有没有更好的方法来实现这一点。

qnzebej0

qnzebej01#

mysql只允许对临时表有一个引用。你可以把table复制过来。但是,窗口函数是一种更简单的解决方案:

select monthEnd, ticker, wgt / sum(wgt) over (partition by monthEnd) 
from weights w

相关问题