найти строку с самой ранней датой для каждого customerID, который приобрел указанный c продукт, и вернуть дату в новом столбце - PullRequest
0 голосов
/ 10 февраля 2020

Я работаю с PowerBI и имею следующую таблицу:

customer_id|item_id| date    
1          |   A   | 01/01/01        
1          |   B   | 01/01/01        
1          |   A   | 02/02/02        
1          |   A   | 03/03/03        
2          |   A   | 03/03/03        
2          |   C   | 03/03/03        
...

Я хотел бы найти самую раннюю дату для каждого customer_id, который приобрел предмет A, и вернуть 1 в новом столбце. Так что я получаю новый столбец в таблице, который выглядит следующим образом:

customer_id | item_id | date     | Column_want 
1           |   A     | 01/01/01 | 1
1           |   B     | 01/01/01 | blank
1           |   A     | 02/02/02 | blank
1           |   A     | 03/03/03 | blank
2           |   A     | 03/03/03 | 1
2           |   C     | 03/03/03 | blank
...

Я попытался отфильтровать столбец по элементу A, а затем с помощью TOPN(1,...) выбрать только верхние строки. Однако, это не похоже на работу.

Это похоже на такой тривиальный запрос. Есть ли более разумный способ обойти это?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Вы можете создать вычисляемый столбец, используя переменные:

    Column_want = 
            VAR Customer_id ='Table'[customer_id]
            VAR Earliest_date = CALCULATE(MIN('Table'[date]),
                                   FILTER('Table','Table'[customer_id]=Customer_id))
            VAR Earliest_item = CALCULATE(MIN('Table'[item_id]),
                                   FILTER('Table','Table'[date]=Earliest_date),
                                   FILTER('Table','Table'[customer_id]=Customer_id))
    RETURN IF('Table'[date]=Earliest_date && 'Table'[item_id]=Earliest_item,
               1,BLANK())

Идея состоит в том, чтобы вычислить самую раннюю дату для конкретного идентификатора клиента, используя Calculate и max (переменная Earliest_date). Переменная Earliest_Item рассчитывается во избежание пометки нескольких записей для одного и того же клиента как 1. Надеюсь, это поможет.

0 голосов
/ 10 февраля 2020

Для этого можно использовать TOPN, но эта функция возвращает всю строку таблицы, поэтому она выглядит довольно неуклюже, как это:

Column_want = 
IF (
    Table1[item_id] = "A" && Table1[date]
        = SELECTCOLUMNS (
            TOPN (
                1,
                FILTER (
                    Table1,
                    Table1[item_id] = "A"
                        && Table1[customer_id] = EARLIER ( Table1[customer_id] )
                ),
                Table1[date], ASC
            ),
            "date", Table1[date]
        ),
    1
)

Я бы предложил что-то более похожее на это:

Column_Want = 
IF (
    Table1[date]
        = CALCULATE (
            MIN ( Table1[date] ),
            FILTER (
                ALLEXCEPT ( Table1, Table1[customer_id], Table1[item_id] ),
                Table1[item_id] = "A"
            )
        ),
    1
)

Или это:

Column_Want =
IF (
    Table1[date]
        = MINX (
            FILTER (
                Table1,
                EARLIER ( Table1[item_id] ) = "A"
                    && Table1[customer_id] = EARLIER ( Table1[customer_id] )
            ),
            Table1[date]
        ),
    1
)
...