Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 текущее зависит от предыдущего  [new]
Neep
Member

Откуда:
Сообщений: 12
Добрый день.
Microsoft SQL Server 2012 (SP1)
Надо посчитать значение строки зная предыдущее значение.
т.е. такое
64
32
16
8
...
В данном случае значение равно пред деленное на 2, только там формула сложнее будет.
Рекурсию не хотелось бы здесь применять, нельзя ли через оконные функции решить?
31 окт 17, 14:46    [20915797]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Neep,

откуда сервер знает, что после чего расположено?
Читает первый пост этой темы?
31 окт 17, 14:48    [20915810]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
LEAD
LAG
31 окт 17, 14:56    [20915855]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Neep
нельзя ли через оконные функции решить?
LAG()
31 окт 17, 14:58    [20915866]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
Neep
Member

Откуда:
Сообщений: 12
Cammomile,
А как, я их крутил по всякому, так и не смог добиться нужного.

вот например
declare @s int = 64
declare @T table(id int, a int)
insert into @T values(1, 2),(2, 2),(3, 2),(4, 2)
select * from @T order by id

Надо сделать колонку b = пред(результат) / a. А первоначальное значение будет @s
31 окт 17, 15:01    [20915885]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
select *,@s/ROW_NUMBER() OVER (ORDER BY 1/0)  from @T order by id
31 окт 17, 15:04    [20915899]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
Neep
Member

Откуда:
Сообщений: 12
TaPaK,
Так получаем @s деленное на номер строки ( на 1, 2, 3...).
Не то.
31 окт 17, 15:09    [20915936]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Neep
Cammomile,
А как, я их крутил по всякому, так и не смог добиться нужного.

вот например
declare @s int = 64
declare @T table(id int, a int)
insert into @T values(1, 2),(2, 2),(3, 2),(4, 2)
select * from @T order by id

Надо сделать колонку b = пред(результат) / a. А первоначальное значение будет @s

То есть в первой строке будет @s, во второй @s/a, в третьей @s/a*a, в четвертой @s/a^3.
Не проще ли в колонку b вывести @s/(a^(n-1)) для строки номер n = ROW_NUMBER().
31 окт 17, 15:13    [20915959]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Neep
TaPaK,
Так получаем @s деленное на номер строки ( на 1, 2, 3...).
Не то.

замени на LAG(Id)
31 окт 17, 15:15    [20915970]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А может наш косонязычный друг хочет рекурсию, т.е. CTE?
31 окт 17, 15:21    [20915995]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Cammomile
А может наш косонязычный друг хочет рекурсию, т.е. CTE?

это пусть местный балабол выясняет, должен же он пользу приносить
31 окт 17, 15:22    [20916002]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
Neep
Member

Откуда:
Сообщений: 12
Andy_OLAP


Надо сделать колонку b = пред(результат) / a. А первоначальное значение будет @s
То есть в первой строке будет @s, во второй @s/a, в третьей @s/a*a, в четвертой @s/a^3.
Не проще ли в колонку b вывести @s/(a^(n-1)) для строки номер n = ROW_NUMBER().


Формула верна когда "a" одинаковые, а когда разные?

declare @s int = 64
declare @T table(id int, a int)
insert into @T values(1, 2),(2, 1),(3, 3),(4, 2)
select * from @T order by id

должно получиться
64/2
64/2/1
64/2/1/3
64/2/1/3/2
31 окт 17, 15:40    [20916077]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Neep
Andy_OLAP

Надо сделать колонку b = пред(результат) / a. А первоначальное значение будет @s
То есть в первой строке будет @s, во второй @s/a, в третьей @s/a*a, в четвертой @s/a^3.
Не проще ли в колонку b вывести @s/(a^(n-1)) для строки номер n = ROW_NUMBER().


Формула верна когда "a" одинаковые, а когда разные?

declare @s int = 64
declare @T table(id int, a int)
insert into @T values(1, 2),(2, 1),(3, 3),(4, 2)
select * from @T order by id

должно получиться
64/2
64/2/1
64/2/1/3
64/2/1/3/2

А когда a - это значение в столбце, а не константа A, то автору темы неплохо бы это сформулировать таким образом, который не допускает неявных трактовок.
31 окт 17, 15:42    [20916088]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
Neep
Member

Откуда:
Сообщений: 12
Andy_OLAP,

думал что будет понятно, тут "a" - это столбец

declare @T table(id int, a int)
31 окт 17, 15:50    [20916123]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Neep
Andy_OLAP,

думал что будет понятно, тут "a" - это столбец

declare @T table(id int, a int)

Вам уже скинули ссылки на оконные функции. А Вы свою задачу формулируете так, что коллега выше написал "А может наш косонязычный друг хочет рекурсию". Вы не обижайтесь, но Вы привели пример, что хотите увидеть, а лучше расписать алгоритм, что он должен делать. "Хорошо определенная проблема — половина ее решения" (с)
И как только сформулируете - сразу поймете, как прикрутить оконные функции к своей таблице.
31 окт 17, 15:55    [20916155]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
тема стара как... древние ископаемые
DECLARE @s INT = 64
DECLARE @t TABLE ( [id] INT, [a] INT )
INSERT INTO @t VALUES (1, 2), (2, 2), (3, 2), (4, 2)
SELECT
  [id],
  [s] = 1.0 * @s / EXP( SUM( LOG( [a] ) ) OVER ( ORDER BY [id] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) )
FROM
  @t
ORDER BY
  [id]
31 окт 17, 16:05    [20916203]     Ответить | Цитировать Сообщить модератору
 Re: текущее зависит от предыдущего  [new]
Neep
Member

Откуда:
Сообщений: 12
Руслан Дамирович
тема стара как... древние ископаемые
DECLARE @s INT = 64
DECLARE @t TABLE ( [id] INT, [a] INT )
INSERT INTO @t VALUES (1, 2), (2, 2), (3, 2), (4, 2)
SELECT
  [id],
  [s] = 1.0 * @s / EXP( SUM( LOG( [a] ) ) OVER ( ORDER BY [id] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) )
FROM
  @t
ORDER BY
  [id]


Да, оно, я как раз сейчас пришел к выводу, что надо через умножение делать, а это значит использовать логарифмы. Вы меня обогнали и очень помогли. Спасибо.
31 окт 17, 16:25    [20916299]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить