Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Удаление дубликатов в столбце по условию в PowerQuery, Удалить средствами PQ в столбце дубликаты и оставить те, которые удовлетворяют условию.
 
Уважаемые форумчане!
Прошу помочь. Необходимо в массиве данных через PQ удалить в столбце "Номер" повторяющиеся номера деталей и оставить только те, которые находятся меньше дней на складе (колонка "Дней на складе").  Также в колонке имеются и другие номера, которые не повторяются, их также необходимо оставить.
Прошу Вас также учесть, что часть кода по обработке уже написана, и это уже завершающий этап. То есть, если не затруднит, то код прописать так, чтобы его можно было вставить в конечный фрагмент.
Спасибо!
 
Используйте группировку по полю Номер, с функцией агрегирования Мин по полю "Дней на складе"
 
Как-то так:
Код
let
    Истоlet
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Склад", type text}, {"Столбец1", type any}, {"Столбец2", type any}, {"Столбец3", type any}, {"Столбец4", type any}, {"Столбец5", type any}, {"Столбец6", type any}, {"Столбец7", type any}, {"Столбец8", type any}, {"Столбец9", type any}, {"Столбец10", type any}, {"Номер", type text}, {"Дней на складе", Int64.Type}}),
    #"Объединенные запросы" = Table.Join(#"Измененный тип",{"Номер","Дней на складе"},Table.Group(#"Измененный тип", {"Номер"}, {{"Фильтр", each List.Min([Дней на складе]), type number}}),{"Номер","Фильтр"}),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Объединенные запросы",{"Фильтр"}),
    #"Удаленные дубликаты" = Table.Distinct(#"Удаленные столбцы", {"Номер", "Дней на складе"})
in
    #"Удаленные дубликаты"

Последний шаг, это на всякий случай, если имеются дубли по номеру и при этом имеют одинаковое значение в столбце "Дней на складе". Если нужно оставлять все такие строки, то убирайте последний шаг.
Изменено: PooHkrd - 16 Фев 2018 12:40:01
Вот горшок пустой, он предмет простой...
 
StepanWolkoff, немного не ясно. Как бы с группировкой знаком, но как она удалит дубликаты номеров оставив те, которые имеют минимальный срок хранения на складе? Тем более она удалит все остальные столбцы... Важно ещё оставить структуру дублинцы неизменной, а просто удалить нужные строки.
Изменено: tmhashNIK - 16 Фев 2018 12:34:15
 
PooHkrd уже написал вам текст запроса))
 
Те которые надо удалить остались, стоп туплю... возможно у меня при сортировке полетело... Работает, это у меня при проверке таблицы слетел столбец на удаление.
Изменено: Илья Демид - 16 Фев 2018 12:40:15
 
Чего-то мудрите. Выбираем все столбцы кроме "Дней на складе", жмем "Группировать по...", операция группировки - Мин. по столбцу "Дней на складе", название группировочного столбца - "Дней на складе".

Код
= Table.Group(#"Changed Type", {"Склад", "Столбец1", "Столбец2", "Столбец3", "Столбец4", "Столбец5", "Столбец6", "Столбец7", "Столбец8", "Столбец9", "Столбец10", "Номер"}, {{"Дней на складе", each List.Min([Дней на складе]), type number}})
F1 творит чудеса
 
Я просто не люблю такие группировки. На больших массивах PQ просто умирает при таком количестве группировочных столбцов, по крайней на моей версии Экселя. А вот сочетание группировки по двум столбцам и ИннерДжойна отрабатывает моментально.
Откуда мне знать что там за массив у ТС. К тому же в остальных столбцах неизвестно что за данные, не факт что они повторяются, а в условии задачи дубли проверять нужно только по номеру. Поэтому ну его на фиг. Я остаюсь при своем варианте. 8)
З.Ы. Вообще по идее тут можно было сделать сортировку по Дням на складе по возрастанию, после чего убивать дубли по Номерам, но тут недавно был топик, в котором такая последовательность привела к ... гм ... мягко говоря неожиданным результатам.
Изменено: PooHkrd - 16 Фев 2018 12:49:40
Вот горшок пустой, он предмет простой...
 
PooHkrd, это верно, но тут вопрос - что представляет собой уникальное сочетание - Склад-Номер, или Склад-столбцы-столбцы-Номер. Как минимум, я так понимаю, Склад-Номер
Если у ТС номер может дублироваться, если выбросить предыдущие столбцы... впрочем, ему виднее.
F1 творит чудеса
 
Максим Зеленский, скорее всего не совсем то т.к. остаются дубли по № (т.к. склады разные )
 
Да мне самому не понятно, почему при удалении дублей не учитывается склад. Но такая вот задача. Пусть выбирает как ему надо, решений уже целых два.
Вот горшок пустой, он предмет простой...
 
PooHkrd, все верно, дубли нужно убрать по номеру, всю строку. В остальных столбца тоже инфа есть.
И что-то код не отсёк все номера. Скорее всего я не то что-то делаю. А можно по шагам растолковать, как это сделать без кода? Спасибо!
Изменено: tmhashNIK - 16 Фев 2018 12:55:08
 
Склад не важен, нужно удалить всю строку того номера который находиться на складе больше своего дубля.
 
Вот вариант почти весь "кнопочный". Ручками правил только шаг Объединенные запросы. Изначально нужно проводить слияние таблицы самой с собой по двум столбцам (смотри скриншот. Появится этот шаг, В таком виде:
Код
= Table.NestedJoin(#"Сгруппированные строки",{"Номер", "Фильтр"},#"Сгруппированные строки",{"Номер", "Фильтр"},"NewColumn",JoinKind.Inner)

Я его ручками переделываю в тот вид, что ниже:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Склад", type text}, {"Столбец1", type any}, {"Столбец2", type any}, {"Столбец3", type any}, {"Столбец4", type any}, {"Столбец5", type any}, {"Столбец6", type any}, {"Столбец7", type any}, {"Столбец8", type any}, {"Столбец9", type any}, {"Столбец10", type any}, {"Номер", type text}, {"Дней на складе", Int64.Type}}),
    #"Сгруппированные строки" = Table.Group(#"Измененный тип", {"Номер"}, {{"Фильтр", each List.Min([Дней на складе]), type number}}),
    #"Объединенные запросы" = Table.NestedJoin(#"Измененный тип",{"Номер", "Дней на складе"},#"Сгруппированные строки",{"Номер", "Фильтр"},"NewColumn",JoinKind.Inner),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Объединенные запросы",{"NewColumn"}),
    #"Удаленные дубликаты" = Table.Distinct(#"Удаленные столбцы", {"Номер", "Дней на складе"})
in
    #"Удаленные дубликаты"
Изменено: PooHkrd - 16 Фев 2018 13:05:37
Вот горшок пустой, он предмет простой...
 
PooHkrd, проделал, все на своём примере. Всё работает! Теперь сделаю на рабочем файле. Попробу. Отпишусь Вам!
В очередной раз меня выручаете! Спасибо!
 
PooHkrd, а что если у меня в коде уже есть переменная с именем Удаленныее столбцы ранее в коде. Как добавить предпоследнюю строку вашего кода с таким же наименование?
 
Удаленные столбцы1, помогут вам. Типо такого:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Склад", type text}, {"Столбец1", type any}, {"Столбец2", type any}, {"Столбец3", type any}, {"Столбец4", type any}, {"Столбец5", type any}, {"Столбец6", type any}, {"Столбец7", type any}, {"Столбец8", type any}, {"Столбец9", type any}, {"Столбец10", type any}, {"Номер", type text}, {"Дней на складе", Int64.Type}}),
    #"Сгруппированные строки" = Table.Group(#"Измененный тип", {"Номер"}, {{"Фильтр", each List.Min([Дней на складе]), type number}}),
    #"Объединенные запросы" = Table.NestedJoin(#"Измененный тип",{"Номер", "Дней на складе"},#"Сгруппированные строки",{"Номер", "Фильтр"},"NewColumn",JoinKind.Inner),
    #"Удаленные столбцы1" = Table.RemoveColumns(#"Объединенные запросы",{"NewColumn"}),
    #"Удаленные дубликаты" = Table.Distinct(#"Удаленные столбцы1", {"Номер", "Дней на складе"})
in
    #"Удаленные дубликаты"
Изменено: PooHkrd - 16 Фев 2018 13:59:35
Вот горшок пустой, он предмет простой...
 
PooHkrd, вы кудесник!)
Спасибо!  На своём рабочем файле проделал. Всё работает, чётко!
 
Я не кудесник. Два кудесника окопались вот тут. я по крайней мере половины не понимаю, что они там  в скриптах пишут. И щас к ним еще кудесников набежит  ;)
Рад был помочь.
Вот горшок пустой, он предмет простой...
Страницы: 1
Читают тему (гостей: 1)
Наверх