为购买特定产品的每个客户 ID 找到最早日期的行,并在新列中找到 return 日期
finding the row with earliest date for each customerID who purchased specific product and return the date in new column
我正在使用 PowerBI 并拥有以下 table:
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 和 return 1 的最早日期。这样我就可以在 table 中得到一个新的列,如下所示:
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,...)
仅选择最上面的行。但是,好像不行。
这似乎是一个微不足道的要求。有没有更聪明的方法解决这个问题?
可以为此使用 TOPN
但那个功能 returns 整行 table 所以它看起来很笨重,像这样:
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
)
您可以使用变量创建计算列:
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 变量)计算特定客户 ID 的最早日期。 Earliest_Item 计算变量是为了避免同一客户的多条记录被标记为 1。希望这对您有所帮助。
我正在使用 PowerBI 并拥有以下 table:
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 和 return 1 的最早日期。这样我就可以在 table 中得到一个新的列,如下所示:
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,...)
仅选择最上面的行。但是,好像不行。
这似乎是一个微不足道的要求。有没有更聪明的方法解决这个问题?
可以为此使用 TOPN
但那个功能 returns 整行 table 所以它看起来很笨重,像这样:
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
)
您可以使用变量创建计算列:
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 变量)计算特定客户 ID 的最早日期。 Earliest_Item 计算变量是为了避免同一客户的多条记录被标记为 1。希望这对您有所帮助。