Estrarre righe con data massima per sottogruppi fornitore-codice L’argomento è risolto

Non è propriamente un programma di BI, ma nelle sue versioni più recenti anche Excel può fare grandi cose!

Moderatore: Utilizzo_prof_Excel

Rispondi
Avatar utente

alex77
Messaggi: 160 | Topic creati
Iscritto il: sab 24 ott 2020, 23:04
Luogo: Treviso
Ringraziato: 11 volte

Estrarre righe con data massima per sottogruppi fornitore-codice

Messaggio 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
Allegati
ESEMPIO.xlsx
(18.9 KiB) Scaricato 118 volte


Avatar utente

Andrea90
Messaggi: 2255 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 672 volte
Contatta:

Estrarre righe con data massima per sottogruppi fornitore-codice

Messaggio 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
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Avatar utente

Autore del topic
alex77
Messaggi: 160 | Topic creati
Iscritto il: sab 24 ott 2020, 23:04
Luogo: Treviso
Ringraziato: 11 volte

Estrarre righe con data massima per sottogruppi fornitore-codice

Messaggio 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
Avatar utente

Andrea90
Messaggi: 2255 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 672 volte
Contatta:

Estrarre righe con data massima per sottogruppi fornitore-codice

Messaggio 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
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Avatar utente

Autore del topic
alex77
Messaggi: 160 | Topic creati
Iscritto il: sab 24 ott 2020, 23:04
Luogo: Treviso
Ringraziato: 11 volte

Estrarre righe con data massima per sottogruppi fornitore-codice

Messaggio 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
Rispondi