#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. Привет! Спасибо за ответ. Но я не уверен, что это то, что мне действительно нужно.