Страницы: 1
RSS
Проверка числовых значений списков на убывание, Power Query
 
Доброго времени суток!

Прошу помочь решить задачку в PQ:
Имеется табличка (2 столбца) с наименованием списков и их числовых значений.
Необходимо проверить значения по каждому списку:
1. Если значения идут на убывание или не изменяются в какой-то последующей позиции, то - ИСТИНА
2. Иначе - ЛОЖЬ

Список 1 - 14, 15, 10, 12, 7 (Ложь)
Список 2 - 10, 9, 9, 8, 8 (Истина)
Список 3 - 7, 7, 7, 7, 7 (Истина)
Список 4 - 9, 8, 7, 6, 5 (Истина)

Файл-пример прилагаю.

Заранее благодарю!
 
Как-то так:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    AddedCustom = Table.AddColumn(
        Source, 
        "Пользовательская", 
        each [
            l = List.Buffer( List.Transform( Text.Split([Значения], ", " ), Number.From ) ),
            z = List.Zip( {List.FirstN( l, List.Count( l ) - 1), List.Transform( List.Skip( l ), each _ * -1 )} ),
            s = List.Count( List.Select( List.Transform( z, List.Sum ), each _ < 0 ) ) = 0][s], 
        type logical )
in
    AddedCustom

Только строку со списком 3 вы некорректно пометили как ИСТИНА, там есть ... 13, 14 ...
Изменено: PooHkrd - 14.01.2020 18:51:42
Вот горшок пустой, он предмет простой...
 
Доброе время суток
Ещё вариант
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    test = Table.AddColumn(Source, "Test", (rec) =>
    let
       toList = Expression.Evaluate("{" & rec[Значения] & "}"),
        test = List.Accumulate(toList, {toList{0}, true}, 
            (acc, item) => 
            if acc{1} then
                {item, (acc{0} - item) >= 0}
            else
                acc
        )
    in
        test{1}
    )
in
    test
 
PooHkrd, Огромное спасибо!

Очень интересное решение!
А можно расшифровку логики к переменным z и s в Вашем коде?
 
Андрей VG, Здравствуйте!

Спасибо за Ваш вариант! Тоже супер!

Я для себя в прошлом решил подобную задачу, но "топорным" способом, с помощью индексирования и созданием столбца с многократными  условиями if / then. Никак не могу отбросить стереотипы решения  по Excel-формулам. Как это победить не знаю... Здесь просто упростил пример и закинул на форум, чтобы посмотреть мастер-класс, так сказать для собственного развития.

Еще раз всем большое спасибо!!!
 
.
Код
= Table.AddColumn(Source, "Рез", each List.Sort(List.Transform(Text.Split([Значения],", "), Number.From ),1)=List.Transform(Text.Split([Значения],", "), Number.From ))
 
artyrH, ай, маладец, вообще мудрить не стал. А я там начудил то.  :D
Вот горшок пустой, он предмет простой...
 
:)  
 
RVA, берём список без последнего элемента и его же без первого и умножаем на - 1. Потом совмещаем их и по-элементно суммируем, далее оставляем в списке только отрицательные элементы и сравниваем количество элементов в списке с 0. Но это все фигня мне больше нравится вариант Артура. Я там перемудрил.
artyrH, но результат Text.Split все таки лучше бы сохранить в переменную через List.Buffer и уже потом сравнивать сортированный список с исходным.
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
и уже потом сравнивать сортированный список с исходным
не получается почему то у меня
Изменено: artyrH - 14.01.2020 22:11:35
 
Цитата
PooHkrd написал:
но результат Text.Split все таки лучше бы сохранить в переменную через List.Buffer и уже потом сравнивать сортированный список с исходным.
В данном случае без разницы. Добавил
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content]
in
    Table.AddColumn(Source, "Рез", each 
    let
        numList = List.Buffer(List.Transform(Text.Split([Значения], ", "), Number.From))
    in
        List.Sort(numList, Order.Descending) = numList
    )

На 100000 исходных с длинной списка на 40 чисел - скорость та же, что и без буфера. List.Transform(Text.Split([Значения], ", "), Number.From) эффективнее, чем через Expression.Evaluate. Заменил в своём коде, скорость такая же, как и в реализации Артура.
Страницы: 1
Наверх