Перемещение вычислений с использованием SQL

#sql #sql-server #window-functions #calculated-columns #calculation

#sql #sql-сервер #окно-функции #вычисляемые столбцы #вычисление

Вопрос:

Мне нужно вычислить новый столбец, используя перемещение вычислений.

Например, у меня есть таблица:

A B
10 15
11 14
12 13

Мне нужно вычислить новый столбец, в котором 1-е значение вычисляется как 5000/10*15 , 2-е значение равно (5000 / 10 * 15) / 11 * 14 , 3 ((5000 / 10 * 15) / 11 * 14) / 12 * 13 -е значение равно и так далее. Где 5000 — случайное значение, и в будущем я буду использовать его как параметр в хранимой процедуре.

Я знаю, что, например, в Excel мы можем ссылаться на предыдущую вычисляемую ячейку. Как это можно вычислить с помощью SQL?

Спасибо!

Комментарии:

1. Пожалуйста, попробуйте и покажите нам, что вы пробовали и где вы застряли!

2. Таблицы SQL представляют собой неупорядоченные (мульти-) наборы. Ваша таблица не имеет видимого порядка. Если для этой цели используется первый столбец, вы должны быть явными.

Ответ №1:

 create table #test (A int,B int)

insert into #test values(10,15),(11,14),(12,13)

declare @seed int=5000;

;with temp as (
 select A,B,row_number() over(order by a) rn from #test
),
cte as
(
 select @seed/A*B  calculated,rn from temp where rn=1
 union all
 select c. calculated/t.A*t.B,t.rn from temp t
 join cte c on t.rn=c.rn 1
)
select * from cte
 

Ответ №2:

В документах есть предупреждение, которое гласит:

Если в одном операторе SELECT имеется несколько предложений присваивания, SQL Server не гарантирует порядок вычисления выражений. Обратите внимание, что эффекты видны только в том случае, если среди назначений есть ссылки. Это означает, что нет никакой гарантии, что он будет вычислять выражение слева направо. Для этого кода:

 declare @a int, @b int;
select @a = 2, @b = @a * 3;
select @a, @b;
 

Результат может быть 2,6 (@a = … вычисляется первым) или 2, NULL (@b = … оценивается в первую очередь).

Комментарии:

1. Привет! Спасибо за ответ. Но я не уверен, что это то, что мне действительно нужно.