如何在Power BI的M中选择每个类别具有最大值的行。假设我们有表:
+----------+-------+------------+
| Category | Value | Date |
+----------+-------+------------+
| apples | 1 | 2018-07-01 |
| apples | 2 | 2018-07-02 |
| apples | 3 | 2018-07-03 |
| bananas | 7 | 2018-07-04 |
| bananas | 8 | 2018-07-05 |
| bananas | 9 | 2018-07-06 |
+----------+-------+------------+
期望的结果是:
+----------+-------+------------+
| Category | Value | Date |
+----------+-------+------------+
| apples | 3 | 2018-07-03 |
| bananas | 9 | 2018-07-06 |
+----------+-------+------------+
这是PBI的开始表:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSiwoyEktVtJRMgRiIwNDC10Dc10DQ6VYHSQ5I2Q5I1Q5Y2Q5Y7BcUmIeEIIkzZElTdAkLZAlTdEkLZElzZRiYwE=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Category = _t, Value = _t, Date = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Category", type text}, {"Value", Int64.Type}, {"Date", type date}})
in
#"Changed Type"
我想知道是否有一种方法可以通过添加一些魔术列IsMax在仅一张表中的后续步骤中获得期望的结果:
+----------+-------+------------+-------+
| Category | Value | Date | IsMax |
+----------+-------+------------+-------+
| apples | 1 | 2018-07-01 | 0 |
| apples | 2 | 2018-07-02 | 0 |
| apples | 3 | 2018-07-03 | 1 |
| bananas | 7 | 2018-07-04 | 0 |
| bananas | 8 | 2018-07-05 | 0 |
| bananas | 9 | 2018-07-06 | 1 |
+----------+-------+------------+-------+
答案 0 :(得分:3)
创建一个计算列:
IsMax =
VAR Max_Value =
CALCULATE (
MAX ( Table[Value] ),
FILTER ( Table, Table[Category] = EARLIER ( Table[Category] ) )
)
RETURN
IF ( Table[Value] = Max_Value, 1, 0 )
工作原理: 首先,FILTER函数选择表中与当前行具有相同Category的所有记录,并找到它们的最大值。结果保存到变量中。 其次,IF比较当前行值和保存的最大值。
答案 1 :(得分:3)
在Power Query编辑器中进行基本的分组依据(按Category
分组并取Value
的最大值)可获得此表:
+----------+-------+
| Category | Value |
+----------+-------+
| apples | 3 |
| bananas | 9 |
+----------+-------+
向该表中添加一个自定义列IsMax
,该列只是值1
,然后将其合并(左外部联接)与在Category
和{{1 }}。最后,展开Value
列以获取所需的表,但用IsMax
代替null
。您可以选择替换0
的值。
这是所有这些步骤的M代码:
null
答案 2 :(得分:0)
我最终通过MAX
获得了每个类别的index
。这里描述的想法:https://stackoverflow.com/a/51498237/1903793
方法1 是R转换中的单行代码:
library(dplyr)
output <- dataset %>% group_by(Category) %>% mutate(row_no_by_category = row_number(desc(Date)))
方法2 ,完全在PBI中完成:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSiwoyEktVtJRMgRiIwNDC10Dc10DQ6VYHSQ5I2Q5I1Q5Y2Q5Y7BcUmIeEIIkzZElTdAkLZAlTdEkLZElzZRiYwE=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Category = _t, Value = _t, Date = _t]),
#"Grouped rows" = Table.Group(Source, {"Category"}, {{"NiceTable", each Table.AddIndexColumn(Table.Sort(_,{{"Date", Order.Descending}} ), "Index",1,1), type table}} ),
#"Expanded NiceTable" = Table.ExpandTableColumn(#"Grouped rows", "NiceTable", {"Value", "Date", "Index"}, {"Value", "Date", "Index"}),
#"Filtered Rows" = Table.SelectRows(#"Expanded NiceTable", each ([Index] = 1))
in
#"Filtered Rows"