Страницы: 1 2 След.
RSS
Power Query. Удаление подряд идущих дубликатов только в двух столбцах с сохранением строки
 
Здравствуйте. Подскажите, можно ли это сделать штатными инструментами. Та функция, что есть, удаляет всю строку целиком. Файл не удалось загрузить, меньше 400 кб не получилось сделать. [/IMG]  На картинке желтым выделено, что надо удалить.
Код
let
    
    Источник = Excel.Workbook(File.Contents(Excel.CurrentWorkbook(){[Name="Параметры"]}[Content]{0}[Путь к исходным данным]), null, true),
    #"Строки с примененным фильтром" = Table.SelectRows(Источник, each ([Name] = "Осн." or [Name] = "Эл.")),
    #"Другие удаленные столбцы" = Table.SelectColumns(#"Строки с примененным фильтром",{"Data"}),
    #"Развернутый элемент Data" = Table.ExpandTableColumn(#"Другие удаленные столбцы", "Data", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12", "Column13", "Column14", "Column15", "Column16"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12", "Column13", "Column14", "Column15", "Column16"}),
    #"Строки с примененным фильтром1" = Table.SelectRows(#"Развернутый элемент Data", each ([Column1] <> null)),
    #"Повышенные заголовки" = Table.PromoteHeaders(#"Строки с примененным фильтром1", [PromoteAllScalars=true]),
    #"Измененный тип" = Table.TransformColumnTypes(#"Повышенные заголовки",{{"Участок", type text}, {"№ опер.", type any}, {"     Наименование", type text}, {"ГОСТ сорт", type text}, {" Марка материала", type any}, {"ГОСТ ТУ", type text}, {"МКК", type text}, {"Профиль", type any}, {"Размер", type any}, {"Единица изм-я", type text}, {"Норма1", type any}, {"/-", type text}, {"Норма2", type any}, {"/-2", type text}, {"Норма3", type text}, {"Column16", Int64.Type}}),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Измененный тип",{"Column16"}),
    #"Измененный тип1" = Table.TransformColumnTypes(#"Удаленные столбцы",{{"Норма3", type number}, {"Норма2", type number}}),
    #"Строки с примененным фильтром2" = Table.SelectRows(#"Измененный тип1", each ([Участок] = "КТУ" or [Участок] = "МСУ")),
    #"Сгруппированные строки" = Table.Group(#"Строки с примененным фильтром2", {"Участок", "№ опер.", "     Наименование", "ГОСТ сорт", " Марка материала", "ГОСТ ТУ", "МКК", "Профиль", "Размер", "Единица изм-я", "/-", "/-2"}, {{"Норма1С", each List.Sum([Норма1]), type number}, {"Норма2С", each List.Sum([Норма2]), type anynonnull}, {"Норма3С", each List.Sum([Норма3]), type text}}),
    #"Переупорядоченные столбцы" = Table.ReorderColumns(#"Сгруппированные строки",{"Участок", "№ опер.", "     Наименование", "ГОСТ сорт", " Марка материала", "ГОСТ ТУ", "МКК", "Профиль", "Размер", "Единица изм-я", "Норма1С", "/-", "Норма2С", "/-2", "Норма3С"}),
    #"Измененный тип2" = Table.TransformColumnTypes(#"Переупорядоченные столбцы",{{"Норма3С", type number}})
in
    #"Измененный тип2"
 
 
Цитата
maxrus163 написал:
меньше 400 кб не получилось сделать
  1. Не верю. Зачем нам весь файл? Зачем нам предыдущие шаги? Вы получаете какую-то таблицу, в которой хотите удалить дубликаты по какому-то правилу. Так приложите только эту таблицу, обрезанную и обфусцированную, но отражающую суть.
  2. Непонятно, что нужно получить. Как должен выглядеть результат?
F1 творит чудеса
 
Максим Зеленский, я так и хотел сделать. Поудалял все ненужное, осталось две обычные таблицы откуда работает запрос и одна табличка где прописан путь к файлу, но файл все равно 400 кб. Результат - такая же таблица как на фото только без дубликатов в желтых ячейках.
 
Ок, давайте разговаривать картинками.

Что должно произойти с выделенным красной рамкой? Что должно произойти с выделенным желтым цветом? Нарисуйте правильный ответ

 
Изменено: Максим Зеленский - 10.07.2020 11:24:15
F1 творит чудеса
 
Цитата
maxrus163 написал:
осталось две обычные таблицы откуда работает запрос и одна табличка где прописан путь к файлу, но файл все равно 400 кб

... сгенерируйте таблицу вплоть до 12-го шага вашего запроса. Отфильтруйте только те данные, которые отражают типичную картину (есть дубликаты и нет дубликатов). Переименуйте секретные данные. Сделайте таблицу, которая будет показывать желаемый результат на этом примере. Прикрепите этот файл без каких-либо запросов. Уверяю, можно уложиться в 40 кб
F1 творит чудеса
 
Максим Зеленский, сгенерировать снова это долго. Я уже подзабыл, что за чем идет.
На самом деле запрос простой. С двух обычных таблиц, одинаковых по структуре, запрос сводит данные в одну и если строчки совпадают по содержанию, то выполняется сумма по столбцам "Норма1, Норма2, Норма3. На картинке показана таблица с различающимися строчками. Так вот, в первом и втором столбце есть дубликаты. Надо, чтобы подряд идущие PQ скрывал, я их выделил желтым. Раньше, я получал эти данные сводной таблицей, так в свойствах убрать эти дубликаты можно было штатно, но из-за некоторых недостатков сводной пришлось перейти на PQ. Тут не могу найти такого.
Изменено: maxrus163 - 10.07.2020 11:48:34
 
Цитата
Максим Зеленский написал:
Нарисуйте правильный ответ
это последняя попытка помочь. ответьте на вопрос в сообщении #5
F1 творит чудеса
 
Максим Зеленский, со всем, что выделено красным уже все произошло - это остается, а все, что выделено желтым не должно быть. Что рисовать-то?

Здесь описана подобная задача, только один столбец. Но там делают манипуляции с кодом.
 
maxrus163, вам требуется при наличии подряд идущих дубликатов в двух столбцах сделать ячейки пустыми до появления следующего уникального сочетания ?

Цитата
maxrus163 написал:
Но там делают манипуляции с кодом.
Когда вы пишите формулу добавляемого столбца, это воспринимается как манипуляции с кодом или как стандартная операция?
Изменено: PooHkrd - 10.07.2020 14:01:49
Вот горшок пустой, он предмет простой...
 
Так, что ли?

 
F1 творит чудеса
 
PooHkrd, Максим Зеленский, да все верно, именно так. Стандартная операция - это когда, залез в меню, поставил галочку, и есть результат. Когда результат получается только  написанием кода для меня это уже нестандартно. Так не сумею. Если тока по разжеванному примеру.
 
Ну вот на примере Маши и Вани, сделал на кнопочках
F1 творит чудеса
 
Максим Зеленский,спасибо, жаль шаги не русифицированы. Ну да ладно, буду разбираться. Так и придется вспоминать PQ. В сводных было намного проще.
Да, и за терпение тоже благодарю)
Изменено: maxrus163 - 10.07.2020 15:56:34
 
Все получилось! Конечно не с первого раза, но все же. Ничерта не понял механизм, сделал по образцу Максима Зеленского. Спасибо всем!
 
Цитата
maxrus163 написал:
жаль шаги не русифицированы.
Вот вам русифицированные шаги так легче? :)
Код
let
    Источник             = Table.Buffer(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content]),
    УдалятьВСтолбцах     = List.Buffer({"Столбец1","Столбец2"}),
    ИменаСтолбцов        = Table.ColumnNames(Источник),
    ФункцияУдаления      = (Таблица,Итерация)=> let 
                               ИмяСтолбца    = try ИменаСтолбцов{Итерация} otherwise "",
                               Группировка   = Table.Group(Таблица,ИмяСтолбца,{"",each 
                                                   let 
                                                       УдалитьСтолбец = Table.RemoveColumns(_,ИмяСтолбца),
                                                       ВСтолбцы       = Table.ToColumns(
                                                                            if ИмяСтолбца <> ""
                                                                            then @ФункцияУдаления(УдалитьСтолбец,Итерация+1) 
                                                                            else УдалитьСтолбец
                                                                        )
                                                   in 
                                                       ВСтолбцы  
                                               },0),
                               ВСтроки       = Table.ToRows(Группировка),
                               Трансформация = List.Transform(ВСтроки,each 
                                                   Table.FromColumns({ {_{0}} } & _{1})
                                               ),
                               Объединение   = if ИмяСтолбца = "" 
                                                   then Таблица
                                                   else Table.Combine(Трансформация)
                           in 
                               Объединение,
    ПереименоватьСтолбцы = Value.ReplaceType(
                               ФункцияУдаления(Источник,0),
                               Value.Type(
                                   Table.SelectColumns(
                                       Источник,
                                       List.Distinct(УдалятьВСтолбцах & ИменаСтолбцов)
                                   )
                               )
                           )
in
    ПереименоватьСтолбцы
 
Цитата
Андрей Лящук написал:
Вот вам русифицированные шаги так легче?
Андрей, возможно так будет понятнее тоже :)
Скрытый текст
 
Еще вариант
Код
let
    ИСТОЧНИК = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
    ГРУППА = Table.Combine(Table.Group(ИСТОЧНИК, {"Столбец1"}, {{"a",
    each let a=_,b=Table.Combine(Table.Group(_,{"Столбец2"}, {{"b",
    each let a=Table.ToColumns(_),b= {List.FirstN(a{1},1),a{2}} in 
    Table.FromColumns(b)}})[b]),c={{a[Столбец1]{0}}}&Table.ToColumns(b) 
in  Table.FromColumns(c)}})[a]) in ГРУППА
 
Максим Зеленский, к сожалению не работает как нужно. Только сейчас выяснил. При следующих повторениях в столбцах 1 и 2 значения не выводит (
Кто если захочет помочь, не пишите код, я его адаптировать в свой файл все равно не смогу. Лучше на примере книги, я по шагам делаю аналогично.
Изменено: maxrus163 - 31.07.2020 14:14:13
 
maxrus163, так наверное понятнее будет
 
maxrus163, там нужно в двух шагах дописать в формулах, чисто кнопками уже не получится.
То есть всё, что сделано, но в шагах которые группировка (Grouped Rows и Grouped Rows1) нужно в строке формул перед последней скобкой дописать ,0 чтобы получилось вот так:

код

Откройте расширенный редактор запроса, найдите эти строки и поправьте

в другом файле нужно будет сделать то же самое
F1 творит чудеса
 
maxrus163, шаг Replace2 лучше так
Код
= Table.ReplaceValue(Replace1,each [Column5],each [Column1],(a,b,c)=>if a=b and c=null then null else a,{"Column2"})
 
Михаил Л,спасибо за помощь, но, я так понимаю, задачу вы решаете сразу написанием кода. Следовательно, получается коротко (что конечно хорошо) и шаги без настроек и описания в PQ. К сожалению, просто вставить в свой код не получается, ругается то на названия столбцов, то еще на что.

Максим Зеленский, Вам спасибо вновь, нули поставил, заработало)
 
Цитата
maxrus163 написал:
Файл не удалось загрузить, меньше 400 кб не получилось сделать.
Оставьте десять строк и загрузите
 
Михаил Л,уже ради интереса просто, в своем файле создал новый пустой лист, все остальные удалил, удалил все имена в диспетчере имен, сохранил без поддержки макросов и размер этого файла все равно 370кб. Чертовщина какая-то. Создал новый файл, перекопировал туда нужные таблицы, вроде запрос работает. Конечно, надо было сразу так сделать. Да простят меня, форумчане.
 
Цитата
maxrus163 написал:
ради интереса просто
 
Михаил Л, спасибо за вариант.
 
Онаружилась еще одна "аномалия" (см. фото) . Почему-то в первом столбце  повторяются значения через строку, а во втором он повторяет значения в зависимости от значения в первом столбце. Уважаемые Максим Зеленский, Михаил Л как можно это исправить?

 
По первому столбцу кажись разобрался. Решается вставкой шага "сортировкой по возрастанию". Но вот второй столбец убирает дубликаты только в рамках отображенного значения в левом столбце. Если значение в левом столбце меняется, то значение во втором столбце снова отображается. А так не должно быть. Дубликаты должны убираться независимо от первого столбца.
 
А если у вас там будет
КТУ 10
КТУ 20
КСУ 10
КСУ 20
как должны убраться дубликаты?
F1 творит чудеса
Страницы: 1 2 След.
Наверх