PowerQuery - поиск самой последней даты на основе заданного значения и текущей даты - PullRequest
0 голосов
/ 11 июля 2019

У меня есть таблица с именем «Table1», в которой есть два столбца: «Имя» и «Дата».

В Power Query Editor я хочу создать настраиваемый столбец с именем «Последняя дата», чтобы найти самую последнюю дату, когда данное Имя появилось в последний раз.

Например, B впервые появился 5/7/2019, затем 8/9/2019 и, наконец, 17/9/2019. Таким образом, Последней датой для B, когда Дата - 8/8/2019, является 5/7/2019, а Последней датой для B, когда Дата - 17/9/2019, является 8/9/2019. Пожалуйста, смотрите ниже пример.

enter image description here

Я провел некоторые исследования в Интернете, но меня перепутали с пользовательской функцией, VAR, Measure, MAXX, CALCULATE, FILTER и т. Д. ...

Я не знаком ни с DAX, ни с Advanced DAX Editor, поэтому, если возможно, предоставьте подробный ответ или четкие инструкции по применению вашего решения.

Дайте мне знать, если я не прояснил себя. В противном случае ваша оперативная помощь будет высоко оценена!

Ответы [ 3 ]

1 голос
/ 13 июля 2019

Пользовательская функция может выглядеть примерно так:

let
    AddLastDateColumn = (someTable as table) as table =>
        let
            initialHeaders = Table.ColumnNames(someTable),
            sorted = Table.Sort(someTable, {{"Date", Order.Ascending}, {"Name", Order.Ascending}}),
            merged = Table.NestedJoin(sorted, {"Name"}, sorted, {"Name"}, "$joined", JoinKind.LeftOuter),
            lastDateColumn = Table.AddColumn(merged, "Last Date", each
                let
                    maxDate = [Date],
                    filtered = Table.SelectRows([#"$joined"], each [Date] < maxDate),
                    lastRow = if not Table.IsEmpty(filtered) then Table.Last(filtered)[Date] else null // Could use Table.Max, but data is already sorted.
                in lastRow,
                type nullable date),
            dropColumns = Table.SelectColumns(lastDateColumn, initialHeaders & {"Last Date"})
        in dropColumns
in
    AddLastDateColumn

Если вы сохраните вышеупомянутое как собственный запрос, вы сможете получить к нему доступ в других запросах. Например, если вы сохраните вышеупомянутое в качестве запроса с именем AddLastDateColumn, вы можете получить доступ к это в других запросах (как показано ниже):

let
    sourceTable =
        let
            nameColumn = {"A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "D", "E", "F", "G"},
            dateColumn = {#date(2019,7,1), #date(2019,7,5), #date(2019,7,14), #date(2019,7,23), #date(2019,7,24), #date(2019,8,1), #date(2019,8,5), #date(2019,8,10), #date(2019,8,11), #date(2019,8,17), #date(2019,8,23), #date(2019,8,25), #date(2019,9,3), #date(2019,9,4), #date(2019,9,13), #date(2019,9,17), #date(2019,9,23), #date(2019,9,27), #date(2019,9,28), #date(2019,10,6), #date(2019,10,9)},
            toTable = Table.FromColumns({nameColumn, dateColumn}, type table [Name = text, Date = date])
        in toTable,
    invokeFunction = AddLastDateColumn(sourceTable)
in
    invokeFunction

Я искал документацию для Table.NestedJoin (https://docs.microsoft.com/en-us/powerquery-m/table-nestedjoin). Кажется, есть параметр с именем keyEqualityComparers:

Может быть включен необязательный набор keyEqualityComparers, чтобы указать, как сравнивать ключевые столбцы.

У меня нет времени, чтобы изучить его возможности и синтаксис, который ему требуется, но, возможно, его можно использовать для более элегантного определения критериев JOIN: "Name должно точно соответствовать. Right Date должно быть наибольшая дата, которая меньше Left Date ".

В любом случае, я думаю, что вышеуказанная функция должна делать то, что вы искали.

1 голос
/ 11 июля 2019

Power Query и Power BI - это два разных инструмента.

Power Query предназначен для обработки данных.Он использует язык под названием «м».Например, если вам нужно импортировать и объединять файлы, исправлять неверные данные и т. Д. - это то, что вы используете.

Power BI предназначен для анализа данных.Он использует язык под названием «DAX».В большинстве случаев Power BI / DAX полезны для разработки интерактивной аналитики - отчетов, которые реагируют на срезы, фильтры и т. Д.

Некоторые люди используют DAX для улучшения своих данных вместо Power Query - как добавление вычисляемого столбца,Лично я думаю, что это плохая идея, но, возможно, Power Query / m слишком неинтуитивен для них, а DAX проще.Я объясню, как добавить вычисляемый столбец с помощью DAX.Если по какой-то причине вы предпочитаете Power Query, укажите это в своем вопросе.

Во-первых, вы должны находиться в главном окне Power BI, а не в окне Power Query.Перейдите к своей модели данных и выберите свою таблицу.На вкладке «Модель» нажмите «Добавить столбец».Введите формулу DAX:

Last Date = 
  VAR Current_Date = Table1[Date]
  VAR Current_Name = Table1[Name]
RETURN
  CALCULATE( MAX(Table1[Date]), 
             Table1[Date] < Current_Date,
             Table1[Name] = Current_Name )

Формула создаст новый столбец с предыдущей датой для каждого Имени.

Как это работает:

  • При вычислении столбца Power BI выполняет итерации таблицы по записи.Для каждой записи мы сохраняем ее дату в переменной «Current_Date», а ее имя - в «Current_Name»;
  • Затем нам нужно найти дату, которая: а) меньше текущей_даты и б)только для текущих имен.Это достигается путем расчета МАКСИМАЛЬНОЙ даты с 2 фильтрами: дата должна быть <затем Current_Date, а имя должно быть = Current_Name. </li>

Например, для имени «B», первое выделение: оно будет первым фильтромтаблица, оставляющая только записи, где name = "B" (3 записи).Затем он отфильтрует эти 3 записи, чтобы найти даты <11/08/2019, то есть одну запись: 5/07/2019. </p>

В качестве примечания я рекомендую прочитать хотя бы одну хорошую книгуна Power BI / DAX или пройти онлайн-обучение.Этот инструмент не прост, и вы потратите много времени, если попытаетесь изучить его методом проб и ошибок.

0 голосов
/ 12 июля 2019

После того, как RADO направил меня в нужном направлении, я искал еще пару похожих случаев Power Query с использованием языка M и встроенного графического интерфейса, и я нашел способ сначала решить мой вопрос.

1)сортировать мою таблицу по возрастанию в следующих порядках: Имя, Дата;

2) добавить два столбца индекса, один из которых начинается с 0, а другой начинается с 1, а затем объединить саму таблицу, сопоставив столбец индекса 0 со столбцом индекса1;

3) разверните объединенные столбцы [Name.1] и [Date.1], а затем добавьте пользовательский столбец с именем «Last Date» со следующим , если function

if [Name]=[Name.1] then [Date.1] else null

4) Удалите другие столбцы, просто оставьте столбцы [Имя], [Дата] и [Последняя дата].

Приведенный выше метод немного утомителен, если у меня есть несколько таблиц, которым требуетсята же операция.Если кто-то может предоставить решение «Пользовательская функция», используя один запрос, который можно применить к другим таблицам, которые будут высоко оценены!

...