Pagina 1 di 1

Estrarre righe con data massima per sottogruppi fornitore-codice

Inviato: gio 7 set 2023, 13:10
da alex77
Buongiorno a tutti,
data una tabella di listini, con data listino, codice, fornitore, lotto e prezzo ho bisogno di estrarre, per ciascuna combinazione codice-fornitore, le righe dell'ultimo listino (quindi data massima).
Fino ad oggi ho sempre raggruppato per codice-fornitore generando la tabella con tutte le righe, poi su tale tabella applico Table.Max. Di solito questo sistema mi restituisce quello che mi serve perchè per ogni codice-fornitore-data ho una sola riga, avendo già scelto "a monte" il lotto che mi interessa. In questo caso devo estrarre tutti i lotti per la data massima e mi sono reso conto che Table.Max effettivamente dà come output un singolo record.
Sapete come aiutarmi?

Allego file di esempio

Grazie per un eventuale aiuto

Alessandro

Estrarre righe con data massima per sottogruppi fornitore-codice

Inviato: gio 7 set 2023, 13:16
da Andrea90
@alex77,

Codice: Seleziona tutto

let
    Origine = Excel.CurrentWorkbook(){[Name="Input"]}[Content],
    #"Modificato tipo" = Table.TransformColumnTypes(Origine,{{"Fornitore", type text}, {"Codice", type text}, {"Data", type datetime}, {"Lotto", Int64.Type}, {"Prezzo", Int64.Type}}),
    #"Grouped Rows" = Table.Group(#"Modificato tipo", {"Fornitore", "Codice"}, {{"TempTab", each _, type table [Fornitore=nullable text, Codice=nullable text, Data=nullable datetime, Lotto=nullable number, Prezzo=nullable number]}, {"MaxDate", each List.Max([Data]), type nullable datetime}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "FilteredTab", each Table.SelectRows([TempTab], (x)=> x[Data] = [MaxDate])),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Custom",{"FilteredTab"}),
    #"Expanded FilteredTab" = Table.ExpandTableColumn(#"Removed Other Columns", "FilteredTab", {"Fornitore", "Codice", "Data", "Lotto", "Prezzo"}, {"Fornitore", "Codice", "Data", "Lotto", "Prezzo"})
in
    #"Expanded FilteredTab"
Andrea

Estrarre righe con data massima per sottogruppi fornitore-codice

Inviato: gio 7 set 2023, 14:06
da alex77
@Andrea90 grazie mille.
Domanda probabilmente da ignorante:
Perchè se al posto di:

Codice: Seleziona tutto

#"Added Custom" = Table.AddColumn(#"Grouped Rows", "FilteredTab", each Table.SelectRows([TempTab], (x)=> x[Data] = [MaxDate])),
scrivo

Codice: Seleziona tutto

#"Added Custom" = Table.AddColumn(#"Grouped Rows", "FilteredTab", each Table.SelectRows([TempTab], each _[Data] = [MaxDate])),
mi dà errore "Expression.Error: Il campo 'MaxDate' del record non è stato trovato."? Each non corrisponde a (x)=>?

Grazie

Estrarre righe con data massima per sottogruppi fornitore-codice

Inviato: gio 7 set 2023, 14:15
da Andrea90
@alex77,

Potrei chiederti allora come mai questa funziona?

Codice: Seleziona tutto

= Table.AddColumn(#"Grouped Rows", "FilteredTab", (x)=> Table.SelectRows(x[TempTab], each [Data] = x[MaxDate]))
o anche come mai questa funziona:

Codice: Seleziona tutto

= Table.AddColumn(#"Grouped Rows", "FilteredTab", (x)=> Table.SelectRows(x[TempTab], (y)=> y[Data] = x[MaxDate]))
Così da avere un confronto con tutte e tre le espressioni che sono state utilizzate.

Il motivo teorico è relativamente complesso poiché riguarda lo "scope" in cui viene valorizzata la funzione in PQ.
Comunque scritta come avevi fatto tu era una duplicazione di scope dentro alla stessa funzione.

Andrea

Estrarre righe con data massima per sottogruppi fornitore-codice

Inviato: ven 8 set 2023, 10:52
da alex77
Grazie @Andrea90 ,
con i tuoi esempi di alternative di sintassi corretta ho capito il nodo della questione. Non sono molto pratico con le funzioni di M, ma già questo è un mattoncino in più.

grazie ancora