Просмотр с накопленным вычислением собственных ссылок в SQL - PullRequest
0 голосов
/ 10 мая 2018

Я даже не совсем уверен, как назвать то, что я пытаюсь сделать. Мне нужен столбец, который накапливает сумму собственных вычислений в предыдущих строках. Вот упрощенный пример вывода, который мне нужен (d - столбец, с которым мне нужна помощь):

a   b   c   d   e
1   36  6   36  6
2   0   5   30  6
3   0   4   24  6
4   22  10  40  4
5   0   9   36  4
6   0   8   32  4

a - столбец автономного номера

b - введенный пользователем столбец

c - это столбец, который обычно ведет обратный отсчет, но иногда к нему добавляются другие значения

d равно: предыдущий ряд d + b - предыдущий ряд e

e равно d / c

Может помочь, если я объясню, зачем мне это нужно. Я работаю над моделированием воздействия шоковых ставок на банковское учреждение (обычно называемое стресс-тестированием). b - это столбец, отражающий некоторое влияние шока на процентную ставку (например, процентное изменение количества выданных кредитов). c - это столбец, который представляет количество месяцев до того, как ожидается, что рынок вернется в нормальное состояние без каких-либо дальнейших шоковых курсов. d представляет влияние на ссуды за этот период времени, а e - скорость, с которой d возвращается к нулю.

Вот что я пробовал до сих пор и почему это не работает:

SET var := 0;

SELECT var := var + b - var/c AS d

Это было бы моим предпочтительным решением, но я создаю представление, и представлениям не разрешено ссылаться на созданные пользователем переменные. Это должно быть представление, потому что мне нужно ссылаться на него в других запросах и представлениях.

SELECT (lag(d,1,0) OVER (ORDER BY a)) + b - (lag(e,1,0) OVER (ORDER BY a)) AS d

Это не работает, потому что d еще не определено. Я просто получаю сообщение об ошибке, что d не столбец.

SELECT
     ((SELECT sum(temp.b)
     FROM table as temp
     WHERE temp.a <= a)
     /(SELECT sum(temp2.c)
     FROM table as temp2
     WHERE temp2.a = a))

Это не работает, потому что мне нужно разделить уменьшенное значение d, а не просто сумму b.

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Я не уверен, насколько стабильными будут результаты в VIEW, но вы можете использовать переменные сеанса.

SELECT a, b, c, @d := @d + b - @e AS d, @e := @d / c AS e
FROM t
   , (SELECT @d := 0 AS initD, @e := 0 AS initE) As init
ORDER BY a;

Кроме того, имейте в виду, что это своего рода переход в наблюдаемое поведение, фактически не гарантированный; поскольку MySQL официально не гарантирует, что выражения выбора оцениваются слева направо.

0 голосов
/ 15 мая 2018

Я решил это с помощью грубой силы. Я создал постоянную таблицу, а затем я создал триггер, который удаляет все строки таблицы, а затем воссоздает таблицу, используя переменное решение. Таким образом, каждый раз, когда меняются базовые данные, MySQL автоматически обновляет таблицу самой последней информацией. Таблица действует как представление в том смысле, что она обновляется в режиме реального времени, но является постоянной таблицей.

К сожалению, MySQL не предлагает опцию FOR EVERY STATEMENT для триггеров, что означает, что мой код выполняется снова и снова для каждой обновляемой строки, поэтому, если я обновлю 100 строк, моя таблица будет удалена и пересоздана 100 раз .

Все еще ищу лучшее решение, но по крайней мере это работает.

0 голосов
/ 10 мая 2018

d - совокупная сумма разности между b и c.Это будет выражаться как:

select a, b, c,
       sum(b - c) over (order by a) as d,
       d / sum(b - c) over (order by a) as e
from t;

Я использую оконные функции, хотя вопрос помечен MySQL.MySQL поддерживает их только с версии 8.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...