Нормализовать данные с помощью временной таблицы в MySQL - PullRequest
0 голосов
/ 10 июля 2020

У меня есть таблица с весами, которые я хочу перенормировать в MySQL. Я получаю сообщение об ошибке «Невозможно повторно открыть таблицу», когда пытаюсь присоединить его к встроенному запросу, который полагается на себя, и ту же ошибку, когда я пытаюсь использовать 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 (ie, sum (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.

Поскольку мне нужна таблица веса для расчета общего веса, это единственный способ, который я m пытается сделать кажется возможным, это создать еще другую временную таблицу для хранения общего веса и присоединить к ней мою weights таблицу для нормализации.

Есть лучший способ сделать это в MySQL 8.0.

1 Ответ

2 голосов
/ 10 июля 2020

MySQL позволяет иметь только одну ссылку на временную таблицу. Вы могли скопировать таблицу. Однако оконные функции - более простое решение:

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