Страницы: 1
RSS
Можно ли в вычисляемом столбце DAX сделать то, что умеет Эксель рассчитывая ячейки в столбце ,ссылаясь на предыдущие ячейки в этом же столбце
 

Можно ли в Дакс создать вот такой вычисляемый столбец, который при вычислении своих ячеек , ссылается на предыдущую ячейку из себя же , как в Экселе?
Изменено: t330 - 02.09.2020 14:41:29
 
t330, а прямо вот принципиально в DAX? На сколько мне известно в DAX вы такое не сделаете.
В PQ такое сделать и загрузить в модель не покатит?
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
В PQ такое сделать и загрузить в модель не покатит?
Можно и в PQ. Не подскажете как?
 
PQ
Код
= List.Generate(()=>[s=1,i=0,n=1], each [i]<6,each [i=[i]+1,n=[s]+1,s=[s]+n], each [n])
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
PQ
Спасибо за код. Не могли бы пояснить логику работы?
Прочитал вот эту статью http://excel-inside.pro/ru/blog/2017/06/15/%d0%b3%d0%b5%d0%bd%d0%b5%d1%80%d0%b0%­d1%82%d0%be%d1%80-%d0%bf%d1%80%d0%be%d0%b8%d0%b7%d0%b2%d0%be%d0%bb%d1%8c%d0%bd­%d1%8b%d1%85-%d1%81%d0%bf%d0%b8%d1%81%d0%ba%d0%be%d0%b2-%d0%b2-power-query-%d0%b8-pow/ по List.Generate ... Стало понятнее,но не до конца.

List.Generate(()=>[s=1,i=0,n=1], each [i]<6,each [i=[i]+1,n=[s]+1,s=[s]+n], each [n])

Я так понимаю:
1. ()=>[s=1,i=0,n=1]  - это Функция initial , которая не имеет аргументов и ее вычисленное значение равно значению выражения, указанного внутри нее, то есть s=1 i=1 n=1
Не подскажете , почему здесь квадратные скобки []?


2.  each [i]<6 - Это функция Condition  , которая принимает на вход s=1 i=1 n=1 из функции inital в предыдущем шаге и проверяет для каждой строки (each) условие [i]<6

3.если Condition на шаге 2 вернул True, то вычисляется 4й параметр функции  List.generate под названием Selector = each [n].  Функция Selector вычисляет следующий элемент списка. В нашем случае 2й элемент списка будет равен 1 , так как из 1го шага пришел [n] =1

4. если Condition на шаге 2 вернул True , то переходим к третьему параметру функции List.generate под названием Next = each [i=[i]+1,n=[s]+1,s=[s]+n] .
Функция Next вычисляет следующие значения параметров s i n для использования их заново во 2м и 3м  шаге. То есть, на выходе next вернет список [i=1, n=2, s = 3]
и мы снова идем на 2й шаг , проверять условие each[i] <6  

Поправьте пожалуйста, если я где-то ошибаюсь в рассуждениях
 
Цитата
t330 написал:
почему здесь квадратные скобки []
так обозначается запись - record - т.е. набор полей i,n,s - каждое со своим значением
Цитата
t330 написал:
функция Condition  , которая принимает на вход s=1 i=1 n=1 из функции inital
нет, из initial только на первой итерации - вообще [i] означает "текущее значение i" ; а вот это i=[i]+1 - "новое значение i - это текущее плюс один"
Цитата
t330 написал:
3.если Condition на шаге 2 вернул True, то вычисляется 4й параметр функции
нет, вычисляется третий; а из третьего Selector берет необходимое, в данном случае только значение поля n.
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
нет, вычисляется третий; а из третьего Selector берет необходимое, в данном случае только значение поля n.
Спасибо за ответ. По поводу Selector берет из третьего параметра под названием Next значение поля n...

Как же так? Допустим считаем
Первая итерация:
1. ()=>[s=1,i=0,n=1]  - initial
2.  each [i]<6 -  Condition  вернул True
3. переходим к третьему параметру функции List.generate под названием Next = each [i=[i]+1,n=[s]+1,s=[s]+n] .
То есть, на выходе next вернет список
[i=1, n=2, s = 3]

4.вычисляется 4й параметр функции  List.generate под названием Selector = each [n].  
То есть, вернется [n] =2 , так как в третьем шаге функция next вернула [n] =2
,
То есть, получается  , что по такой логике первая итерация вернет нам 2  , а на самом деле возвращает 1...
 
не так выразился, Selector ничего не считает, он берет текущее значение; т.е. на первой итерации возьмет из Initial, а далее как бы из Next предыдущего шага
если опустить последний аргумент
Код
= List.Generate(()=>[s=1,i=0,n=1], each [i]<6,each [i=[i]+1,n=[s]+1,s=[s]+n])
можно увидеть полностью результаты выполнения итераций - на каждом шаге у нас есть запись из которой Selector берет значение, т.е. берет не из аргумента функции, а из памяти. Не знаю как это еще объяснить
Изменено: buchlotnik - 02.09.2020 17:17:53
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik, подскажите пожалуйста еще такой нюанс, как сделать так, чтобы эту формулу можно было использовать для вычисления значения в ячейке в столбце П как на картинке
Код
=Table.AddColumn(#"Добавлен индекс", "П", each List.Generate(()=>[s=1,i=0,n=1], each [i]<#"Добавлен индекс"{2}[Индекс],each [i=[i]+1,n=[s]+1,s=[s]+n], each [n]))


Сейчас на картинке вычисление в столбце П не верное, так как Condition ДЛЯ КАЖДОЙ строки
проверяет [i] по фиксированной строке
Код
#"Добавлен индекс"{2}[Индекс]
 и для каждой строки выдает список 1, 2 ,4


А нужно , как - то сделать так, чтобы для каждой строки выдавался свой список.
То есть, для строки с Индексом 1 , нужен список составленный по Condition
Код
each [i]<#"Добавлен индекс"{0}[Индекс]

Для строки с Индексом 2 , нужен список составленный по Condition
Код
each [i]<#"Добавлен индекс"{1}[Индекс]

Для строки с Индексом 3 , нужен список составленный по Condition
Код
each [i]<#"Добавлен индекс"{2}[Индекс]

Для строки с Индексом 4 , нужен список составленный по Condition
Код
each [i]<#"Добавлен индекс"{3}[Индекс]
и тд
Изменено: t330 - 02.09.2020 17:35:47
 
Код
= Table.AddColumn(#"Добавлен индекс", "П", each [a=[Индекс], b = List.Generate(()=>[s=1,i=0,n=1], each [i]<a,each [i=[i]+1,n=[s]+1,s=[s]+n], each [n])][b])
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik,Спасибо!
 
Если вам нужен именно подсчет, как на скрине в первом сообщении, то там вообще просто:
Если индекс от 1, то формула столбца
Код
Number.Power(2,([Индекс]-1))

Если нужен в каждой ячейке такой список, то
Код
=List.Transform({1..[Индекс]}, each Number.Power(2, _-1))

это, конечно, только для такого вычисления.
F1 творит чудеса
 
Цитата
Максим Зеленский написал:
это, конечно, только для такого вычисления.
Спасибо за ответ. Конечно, это не то что нужно.

Оригинальная задача ниже в сообщении.
Изменено: t330 - 02.09.2020 21:41:05
 
Вот здесь я сделал расчет этой формулы в Power BI, но не удалось этот расчет сделать точно также как в Экселе, где столбец E рассчитывается сам в себе.

В DAX непонятно как вычислить параметр add4 , который используется для расчета столбца Col , не по столбцу E, а по самому столбцу Col, как это умеет Эксель...
Страницы: 1
Наверх