Удаление дубликатов в Powerquery игнорирует то, что я отсортировал данные (поэтому удаляет неправильные дубликаты) - PullRequest
2 голосов
/ 05 марта 2020

У меня есть эти (пример) данные в Excel в таблице с именем Table1:

| PC Item  | Priority |
|----------|----------|
| AN123169 | P3       |
| AN123169 | P1       |
| AN123169 | P1       |
| AN123169 | P1       |
| AN123169 | P3       |  

После сортировки в порядке Приоритет и удаления дубликатов на основе P C Элемент Я ожидаю, что запись P1 останется. Вместо этого я получаю P3 .

В справочном файле говорится:

Удаляет все строки из таблицы Power Query в редакторе запросов, где значения в выбранных столбцах дублируют предыдущие значения ,

Насколько я понимаю, он сохраняет первую запись и удаляет последующие записи?

Код M, который я использую:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"PC Item", type text}, {"Priority", type text}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"PC Item", Order.Ascending}, {"Priority", Order.Ascending}}),
    #"Removed Duplicates" = Table.Distinct(#"Sorted Rows", {"PC Item"})
in
    #"Removed Duplicates"

После #"Sorted Rows" У меня есть эта таблица, которая правильно отсортирована:

| PC Item  | Priority |
|----------|----------|
| AN123169 | P1       |
| AN123169 | P1       |
| AN123169 | P1       |
| AN123169 | P3       |
| AN123169 | P3       |  

После #"Removed Duplicates" У меня есть:

| PC Item  | Priority |
|----------|----------|
| AN123169 | P3       |   

Конечно, у меня должна быть запись P1?


Моей первой мыслью была обратная сортировка, но с этими исходными данными я получаю P3, возвращаемую в качестве уникального значения:

| PC Item | Priority |
|---------|----------|
| AN310C4 | P3       |
| AN310C4 | P1       |
| AN310C4 | P1       |

, и с этими исходными данными я получаю P1 возвращено:

| PC Item | Priority |
|---------|----------|
| AN310C4 | P1       |
| AN310C4 | P1       |
| AN310C4 | P3       |

Вопрос:

Поэтому я предполагаю, что мой вопрос - как сортировка работает, если последующий код M, кажется, игнорирует тот факт, что я ' отсортировали данные?

1 Ответ

2 голосов
/ 05 марта 2020

Используйте Table.Buffer для кэширования промежуточных результатов запроса и избегайте свертывания запросов при удалении дубликатов.


Примеры данных:

enter image description here


Обновлено M:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"PC Item", type text}, {"Priority", type text}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"PC Item", Order.Ascending}, {"Priority", Order.Ascending}}),
    #"Buffer Table" = Table.Buffer(#"Sorted Rows"),
    #"Removed Duplicates" = Table.Distinct(#"Buffer Table", {"PC Item"})
in
    #"Removed Duplicates"

Результат:

enter image description here


Документация (очень маленькая) найдена здесь . Обнаружено информативное видео здесь .

Я нашел другие способы «сломать» свертывание запроса, используя удаление строк ошибок в таблице или добавление столбца индекса (и удаление его). Тем не менее, буфер мне кажется аккуратным.

...