Как удалить дубликаты из отдельных столбцов powerquery, не удаляя целые строки - PullRequest
0 голосов
/ 21 мая 2019

У меня есть таблица данных, в которой записаны данные об экономии затрат, и у меня есть 1 строка на проект.Здесь приведены общие данные о типах проектов, такие как годовые расходы, ежегодные сбережения и т. Д., Но также есть месяцы, в которые сбережения попадают.Чтобы развернуть эти данные, я преобразовал их в таблицу с PowerQuery, но некоторые столбцы повторяются, например, ежегодные расходы за каждый месяц, где есть экономия, поэтому я могу получить 10 строк для экономии, что является правильным, но ежегодные расходы дублируются в 10 раз.Могу ли я удалить дубликаты только в тех столбцах, которые сохраняют другие данные.

Я искал и пробовал различные решения, но не нашел работающего.Я не настроен на формат таблицы данных, поэтому открыт для всего.

Ниже приведен образец данных

Sample of Data Entry

Образецof PowerQuery

PowerQuery Results

Как вы увидите, базовые, согласованные, сберегательные суммы показаны для каждой строки, и мне нужно использовать их вPivot / Slicer.

Любая помощь будет оценена.

С уважением,

Кит

1 Ответ

0 голосов
/ 09 июня 2019

Я думаю, что одним из решений может быть «сохранить только первые 1 ежегодных расходов на проект».Говоря более абстрактно, «сохраняйте только первое значение в столбцах (столбцах) X на столбцы (столбцы) Y».

Ниже приведены некоторые фиктивные / фиктивные данные.Я хочу сохранить только выделенные значения в моем столбце annual spend (поскольку выделенные значения являются первыми показателями "ежегодных расходов" на "проект").

Example data

Это код M, который я использую для достижения этой цели.(Чтобы попробовать, open the Query Editor > Advanced Editor (near top right) > copy-paste code below to there > OK).

let
    OnlyKeepFirstValueInColumn = (someTable as table, columnsToNullify as list) as table =>
        let
            firstRow = Table.FirstN(someTable, 1), // This assumes first row contains a non-blank value.
            remainingRows = Table.Skip(someTable, 1),
            loopAndNullify = List.Accumulate(columnsToNullify, remainingRows, (tableState, currentHeader) => Table.TransformColumns(tableState, {{currentHeader, each null}})),
            combined = firstRow & loopAndNullify
        in combined,
    FirstValueOfColumnsPerGroup = (someTable as table, groupByColumns as list, columnsToNullify as list) =>
        let
            group = Table.Group(someTable, groupByColumns, {{"toCombine", each OnlyKeepFirstValueInColumn(_, columnsToNullify), type table}}),
            combined = Table.Combine(group[toCombine])
        in combined,
    aggregatedTable = Table.FromColumns({Text.ToList("aaabbbccccdddeeefg"), List.Repeat({1000}, Text.Length("aaabbbccccdddeeefg"))}, type table [project=text, annual spend=number]),
    transformed = FirstValueOfColumnsPerGroup(aggregatedTable, {"project"}, {"annual spend"})
in
    transformed

Важный бит, который нужно понять, это строка:

transformed = FirstValueOfColumnsPerGroup(aggregatedTable, {"project"}, {"annual spend"})

, в которой вы должны заменить:

  • aggregatedTable с любой переменной / выражением, содержащим вашу таблицу
  • {"project"} с именем вашего столбца "project" (сохраняйте фигурные скобки {}, хотя они позволяют вам переходить в несколько столбцов при необходимости)
  • {"annual spend"} с именами столбцов, в которых вы хотите сохранить только первое значение (сохраняйте фигурные скобки {})

Это то, что яполучить (что, я думаю, похоже на то, что вы хотите):

Output result


1 Для простоты мыСкажу «первый» здесь означает значение в первом ряду.Это могло означать «первое ненулевое значение» или «первое значение, удовлетворяющее определенному условию или логике», но ваши данные показывают, что более простое определение будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...