Страницы: 1
RSS
Найти крайнее значение в строке и вывести название заголовка в PQ
 
Всем привет!
Есть таблица в которой нужно найти крайнее значение, с лева на право, и вывести название его заголовка. Можно конечно применить отменённое свертывание, вывести крайнее значение через группировку и обратно, но такой процесс слишком муторный и долгий оригинал имеет не один 10 тыщ строк или как вариант тупо через если, но их слиом много получиться). В примере решение привел формулой
 
Я так понимаю, что крайнее не пустое значение ищем все таки справа?
Сделал как в примере. Создаем столбец и в него формулу:
Код
[a = Record.ToList( _ ), b = List.Count( List.Skip( List.Reverse( a ), each _ = null ) ), c = Record.FieldNames(_){b - 1}][c]
Изменено: PooHkrd - 28.03.2020 12:11:55
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
ищем все таки справа?
да все верно с права, опечатался
Спасибо! Все работает, осталось разобраться как!)
Поражаюсь, как вы на ходу пишите код, мне со справочником и готовым решением сложно разобраться!
Изменено: adamm - 28.03.2020 12:32:30
 
adamm,
Код
//преобразовываем текущую строку в список значений
[a = Record.ToList( _ ), 
//Разворачиваем список, убираем все ведущие null, считаем количество элементов в получившемся списке
b = List.Count( List.Skip( List.Reverse( a ), each _ = null ) ),
//из списка имен полей строки обращаемся к b - 1 элементу, -1, это потому что элементы списков нумеруются с нуля.
c = Record.FieldNames(_){b - 1}][c]

Как-то так.
З.Ы. Кстати, такая запись сложных формул позволяет их еще легко отлаживать, достаточно заменить название поля записи (оно в квадратных скобках в конце формулы) на то, которое вы хотите увидеть. Попробуйте поменять его на а или b, сразу все поймете, вам в столбец будут выводиться результаты промежуточных шагов.
Изменено: PooHkrd - 28.03.2020 12:35:01
Вот горшок пустой, он предмет простой...
 
PooHkrd, спасибо разобрался!
 
Цитата
PooHkrd написал:
Попробуйте поменять его на а или b
да, да я уже догнал)
 
Цитата
adamm написал:
как вы на ходу пишите код
Наверное как то так получить нужный результат, а потом все закинуть в запись
Код
// Запрос1
let
    Source = Table.RemoveColumns(Excel.CurrentWorkbook(){[Name="Запрос1"]}[Content],{"ИТОГО"}),
    #"Added Custom" = Table.AddColumn(Source, "add", each [
                                                            a = Record.ToList( _ ), 
                                                            b = List.Count( List.Skip( List.Reverse( a ), each _ = null ) ), 
                                                            c = Record.FieldNames(_){b - 1}
                                                          ][c]),
    Custom1 = Source{0},
    a = Record.ToList(Custom1),
    b = List.Count( List.Skip( List.Reverse( a ), each _ = null ) ),
    c = Record.FieldNames(Custom1){b - 1}
in
    c
 
Цитата
adamm написал:
как вы на ходу пишите код
Дык, ежели его каждый день писать, то оно само так получается.
Вот горшок пустой, он предмет простой...
 
еще вариант
Код
= let
    Source = Table.RemoveColumns(Excel.CurrentWorkbook(){[Name="Запрос1"]}[Content],{"ИТОГО"}),
    fn=(_)=>List.Last(List.RemoveLastN(List.Skip(List.Zip({Record.ToList(_),Record.FieldNames(_)}),4),each _{0}=null)){1}
in
    Table.AddColumn(Source, "ИТОГО", each try fn(_) otherwise 0)
 
PooHkrd, такой код не вернет 0 там, где все столбцы КОЛ РЕВ пустые (как показано в примере), в отличие от кода Андрей Лящук. (кстати, надо все же 5 столбцов убирать).
Мои пару вариантов тоже на всякий случай:
Код
=Table.FirstValue(Table.ReverseRows(Table.SelectRows(Table.Skip(Record.ToTable(_),5),each [Value]<>null)), 0)

Код
=try Table.Last(Table.SelectRows(Table.Skip(Record.ToTable(_),5),each [Value]<>null))[Name] otherwise 0
F1 творит чудеса
Страницы: 1
Наверх