为购买特定产品的每个客户ID查找最早日期的行,并在新列中返回日期

时间:2020-02-10 17:01:58

标签: powerbi dax calculated-columns top-n

我正在使用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        
...

我想找到每个购买商品A并在新列中返回1的customer_id的最早日期。这样我就可以在表中获得一个新列,如下所示:

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 :(得分:0)

可以使用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
)

答案 1 :(得分:0)

您可以使用变量创建一个计算列:

    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(最早的日期变量)来计算特定客户ID的最早日期。计算Earliest_Item变量可避免同一客户的多个记录被标记为1。希望这会有所帮助。