web-dev-qa-db-ger.com

Zeile mit MAX-Wert pro Kategorie auswählen Power BI

So wählen Sie eine Zeile mit maximalem Wert pro Kategorie in M ​​von Power BI aus. Angenommen, wir haben eine Tabelle:

+----------+-------+------------+
| 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 |
+----------+-------+------------+

Die gewünschten Ergebnisse sind:

+----------+-------+------------+
| Category | Value |    Date    |
+----------+-------+------------+
| apples   |     3 | 2018-07-03 |
| bananas  |     9 | 2018-07-06 |
+----------+-------+------------+

Hier ist eine Starttabelle für 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"

Ich frage mich, ob es einen Weg gibt, in den folgenden Schritten innerhalb einer Tabelle zu den gewünschten Ergebnissen zu gelangen, indem Sie einige magische Spalte IsMax hinzufügen:

+----------+-------+------------+-------+
| 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 |
+----------+-------+------------+-------+
1

Am Ende bekam ich MAX durch index. Hier beschriebene Idee: https://stackoverflow.com/a/51498237/1903793

Mein Lieblingsweg soll R-Transformation verwenden:

library(dplyr)
output <- dataset %>% group_by(Category) %>% mutate(row_no_by_category = row_number(desc(Date)))

Das andersherum , vollständig in PBI erledigt:

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"
0

Eine einfache Gruppe durchführen im Power Query-Editor (gruppieren Sie nach Category und nehmen Sie das Maximum über Value), erhalten Sie diese Tabelle:

+----------+-------+
| Category | Value |
+----------+-------+
| apples   |     3 |
| bananas  |     9 |
+----------+-------+

Fügen Sie dieser Tabelle eine benutzerdefinierte Spalte IsMax hinzu, die einfach den Wert 1 darstellt, und fügen Sie sie (linke äußere Verknüpfung) mit Ihrer ursprünglichen Tabelle zusammen, die auf Category und Value übereinstimmt. Erweitern Sie schließlich die Spalte IsMax, um die gewünschte Tabelle abzurufen, außer mit null anstelle von 0. Sie können die null-Werte bei Bedarf ersetzen.

Hier ist der M-Code für all diese Schritte:

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,{{"Value", Int64.Type}, {"Date", type date}, {"Category", type text}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"Category"}, {{"Value", each List.Max([Value]), Int64.Type}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "IsMax", each 1, Int64.Type),
    #"Merged Queries" = Table.NestedJoin(#"Changed Type",{"Category", "Value"},#"Added Custom",{"Category", "Value"},"Added Custom",JoinKind.LeftOuter),
    #"Expanded Added Custom" = Table.ExpandTableColumn(#"Merged Queries", "Added Custom", {"IsMax"}, {"IsMax"})
in
    #"Expanded Added Custom"
3
Alexis Olson

Erstellen Sie eine berechnete Spalte:

IsMax =
VAR Max_Value =
    CALCULATE (
        MAX ( Table[Value] ),
        FILTER ( Table, Table[Category] = EARLIER ( Table[Category] ) )
    )
RETURN
    IF ( Table[Value] = Max_Value, 1, 0 )

Funktionsweise: Zuerst wählt die FILTER-Funktion alle Datensätze in der Tabelle aus, die dieselbe Kategorie wie die aktuelle Zeile haben, und ermittelt ihren maximalen Wert. Das Ergebnis wird in einer Variablen gespeichert. Zweitens vergleicht IF den aktuellen Zeilenwert und den gespeicherten Maximalwert. 

2
RADO