Страницы: 1
RSS
Power Query: как отфильтровать все строки с одинаковым id, если значение хотя бы в одной строке соответствует заданному условию.
 
Добрый день. Есть таблица с данными грузооборота вида id/наименование/вес/кол-во мест/ и т.д. С одним id (номером документа) могут вносится несколько строк наименований.
Мне нужно исключить из дальнейших расчетов все строки с одним id, если хотя бы одна из ячеек такой группы строк пустая (незаполненная).
У меня получился вот такой код:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="данные"]}[Content],
    AddedCustom = Table.AddColumn(Source, "Custom", each if [Наименование]<>null and [вес]<> null and [#"кол-во мест"]<> null and [категория]<> null then [id] else null ),
    GroupedRowsByID = Table.Group(AddedCustom, {"id"}, {{"CountID", each Table.RowCount(_), type number}, {"tab", each _, type table}}),
    GropedRowsByNulls = Table.Group(AddedCustom, {"Custom", "id"}, {{"CountNulls", each Table.RowCount(_), type number}}),
    Joined = Table.Join(GroupedRowsByID, {"id"},GropedRowsByNulls, {"id"}),
    #"Added Conditional Column" = Table.AddColumn(Joined, "Custom.1", each if [CountID] <> [CountNulls] then null else [CountID]),
    Filtered = Table.SelectRows(#"Added Conditional Column", each ([Custom.1] <>null)),
    Expanded = Table.ExpandTableColumn(Filtered, "tab", {"Наименование", "вес", "кол-во мест", "категория"}, {"Наименование", "вес", "кол-во мест", "категория"}),
    #"Removed Other Columns" = Table.SelectColumns(Expanded,{"id", "Наименование", "вес", "кол-во мест", "категория"})
in
    #"Removed Other Columns"
Как мне кажется, конструкция очень громоздкая (и некрасивая).
Вопрос - можно ли решить задачу за меньшее число шагов?
 
Доброе время суток.
У вас вполне нормальный код. Оценивать решение по числу шагов - плохой подход в оценке решения, лучше оценивать по скорости выполнения, расходу памяти. Число строк - это сугубо утилитарное, тут скорее важно - насколько читаем код, чтобы его можно было модифицировать в случае необходимости.
Вариант, по идее, должен быть раза в два быстрее.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="данные"]}[Content],
    grouped = Table.Group(Source, {"id"}, {"temp", (subTable) =>
        if Table.MatchesAnyRows(subTable, each List.Contains(Record.FieldValues(_), null)) then null else subTable
    }),
    notNull = Table.SelectRows(grouped[[temp]], each [temp] <> null),
    result = Table.ExpandTableColumn(notNull, "temp", Table.ColumnNames(Source))
in
    result

Успехов.
 
Андрей VG, спасибо!
Если возможно, объясните, пожалуйста, вот эту запись  ...(subTable) =>...
Я уже три недели переделываю свои старые таблицы под PQ, но пока мне трудно отойти от логики формул Excel и освоить синтаксис М.
 
Есть еще вариант, не такой навороченный, в котором два основных шага: создание условного столбца и группировка
по id "Все строки" и "Мин", а остальные действия больше подготовка к выгрузке.
Запрос "данные2"
 
Цитата
Spooker написал:
вот эту запись  ...(subTable) =>
Это объявление анонимной функции. Если вы строили собственные функции в PQ, думаю пояснение, данное одному из коллег на форуме подойдёт и вам. (Правда он молчит, как пленный партизан - понятно ли :) )
Скрытый текст

Советую почитать спецификацию языка, там много полезного.
Изменено: Андрей VG - 11.06.2018 19:04:12
 
Цитата
belsergey написал:
не такой навороченный,
Интересно, а что там такого навороченного? Простой набор функций Power Query, анонимная функция в Table.Group, в принципе, не нужна.
 
О, сколько всего интересного! Спасибо!
belsergey, List.Min , точно! я же не додумалась.
Андрей VG, спасибо за объяснение, буду разбираться. Справка Microsoft у меня открыта, но не всегда все понимаю.
 
Цитата
Spooker написал:
Справка Microsoft у меня открыта,
Я дал ссылку на страницу, где можно скачать pdf файл с описанием языка.
 
Цитата
Андрей VG написал:
Интересно, а что там такого навороченного? Простой набор функций Power Query, анонимная функция в Table.Group, в принципе, не нужна.
Андрей, не навороченный по сравнению с вариантом Spooker.
Страницы: 1
Наверх