domenica 9 gennaio 2022

Google Sheets - La funzione SORTN() - Spreadsheet con molti esempi

 Ho provato a approfondire il funzionamento della funzione SORTN() presente in Google Sheets.

È una funzione versatile ma credo troppo complessa e nelle pagine di supporto di Google è trattata con una superficialità abbastanza vergognosa.
Più sotto ho incollato il contenuto del primo foglio di uno spreadsheet di Google Sheets dove ho cercato di elencare diverse modalità di funzionamento e uso della funzione, con esempi.
Forse sarà difficile da leggere ma per ora lo metto così, si può trovare lo stesso contenuto nel file, che può essere visto, copiato e modificato.
Nello spreadsheet ci sono diversi altri fogli con esempi.

Un uso interessante e non documentato (non so se l'ho scoperto provando o se ho copiato la cosa da qualche parte) è la possibilità di usare SORTN() per capovolgere i contenuti di un intervallo, usando la funzione ROW() come "colonna virtuale di ordinamento). 
Per esempio:

SORTN(intervallo; n; modo; RIF.RIGA(A2:A20); FALSO)

Dove:
- intervallo è un intervallo di più righe e una o più colonne.
- n è il numero massimo di righe che si vogliono ottenere (considerando che più di 5 milioni di righe non si possono avere si può mettere un numero praticamente "illimitato" tipo 9^9).
- modo è il tipo di "report" che si desidera. va bene "0" che è il default (gli altri sono 1, 2, 3)

La cosa strana è che in genere RIF.RIGA() riporta un solo numero di riga ma se usato come parametro di SORTN() pare generi un array (nell'esempio un array di numeri da 2 a 20).
Questo risultato lo si può ottenere in genere solo inserendo RIF.RIGA() in una funziona ARRAYFORMULA().


Riporta le prime n righe da un elenco dopo averlo ordinato
SORTN()
Guida di Google --->https://support.google.com/docs/answer/7354624
Sintassi completa (da link Google)SORTN(intervallo; [n]; [mostra_tutti_i_legami]; [ordina_colonna1; è_ascendente1], ...)
Sintassi (rivista)
SORTN(intervallo; [n]; [modo_elencazione_legami]; [[colonna_ordinante1; è_ascendente1], [colonna_ordinante2; è_ascendente2],...])
Note sulla sintassi e i parametriLettura della sola sintassi:
1)
intervallo - Il primo parametro è necessario e dev'essere un intervallo di dati da ordinare.
2)
[n] - Il secondo parametro, può essere aggiunto al primo (ma diventa obbligatorio se si usano parametri successivi).
3)
[modo_elencazione_legami] - Il terzo parametro è opzionale (il suo uso implica l'indicazione di [n]).
4)
[[colonna_ordinamento1; è_ascendente1], ...] - Questa espressione indica che il quarto parametro è al minimo una coppia di elementi, alla quale si possono aggiungere altre coppie. Nel quarto parametro gli elementi vanno sempre a due a due.
Note sui tipi di dati dei parametriTipi di dati dei parametri:
-
intervallo - È un intervallo di celle ma otrebbe essere una espressione array, tipo {"A", "B", "C"} oppure generata da una formula array (come FILTER() etc.).
-
n - Valore numerico: (default = 1) una costante o l'indicazione di una cella che contiene il numero, o il risultato di una formula.
-
modo_elencazione_legami - Valore numerico: (default = 0) può assumere i valori 0, 1, 2, 3.
-
colonna_ordinamento1 - Può essere più cose: un numero, un intervallo ma, misteriosamente, anche una espressione tipo RIF.RIGA(A2:A10), che se usata qui viene "espansa" come {2, 3, 4, 5, 6, 7, 8 , 9, 10}. In quest'ultimo caso è possibile per esempio invertire in modo semplice l'ordine dell'elenco sorgente (con è_ascendente = FALSO).
-
è_ascendente - Valore booleano: può essere solo VERO o FALSO (o anche 1 e 0).
FunzionamentoNella versione più semplice la funzione SORTN() riporta il primo elemento dopo avere ordinato una lista (in ordine ascendente, mantenendo gli eventuali duplicati).
Quando si usano i parametri opzionali, la funzione manifesta comportamenti su più dimensioni:
-
il numero di elementi riportati;
-
il tipo di elementi riportati;
-
modalità di ordinamento;
In relazione al "numero di elementi riportati" introdurrei già ora i concetti di "
risultati primari" e di "risultati secondari", che serviranno solo da quando verrà introdotto il terzo parametro. Infatti il parametro "modo_elencazione_legami" può selezionare quattro diverse modalità di report (0, 1, 2, 3), due delle quali possono "aggiungere risultati" rispetto al numeri n indicato. La cosa può essere intesa pensando che n indichi quanti risultati primari si vogliono e che le modalità 1 e 3 abbiano la libertà di aggiungere dei risultati secondari. I risultati secondari sono "duplicati" (ma qui il concetto di "duplicato" indica che le righe ordinate abbiano o meno elementi uguali nelle colonne usate per l'ordinamento). La funzione SORT() non è facile da capire...
Esempi
SORTN(A2:A20)(Versione minima di SORTN(), con intervallo di una sola colonna).
Riporta
un elemento (il primo elemento, dopo avere ordinato gli elementi presenti in colonna A, dalla riga 2 alla 20.
L'ordinamento è in ordine ascendente e include anche i duplicati.
SORTN(A2:C20)(L'intervallo ora è stato espanso a tre colonne).
Riporta
la prima riga (tre colonne in questo caso, dalla A alla C) dopo avere ordinato (in ordine ascendente e includendo anche i duplicati) gli elementi presenti nelle colonne A, B, C, dalla riga 2 alla 20.
L'ordinamento avviene per colonne successive: se in colonna A i contenuti sono uguali viene valutata la colonna B e così via.
Nel caso di righe del tutto identiche viene usato l'ordine di riga (ascendente).
SORTN(A2:C20; 3)(È stato specificando il secondo parametro, che indica il massimo numero di righe da riportareche fino a questo mometo è facoltativo
Riporta le prime
3 righe (tre colonne in questo caso) dopo avere ordinato (in ordine ascendente e includendo anche i duplicati) gli elementi presenti nelle colonne A, B, C, dalla riga 2 alla 20.
L'ordinamento avviene per colonne successive: se in colonna A i contenuti sono uguali viene valutata la colonna B e così via.
Nel caso di righe del tutto identiche viene usato l'ordine di riga (ascendente), prendendo le prime 3.
SORTN(A2:C20; 3; 0)Uguale al precedente, perché il default per il terzo parametro è 0
SORTN(A2:C20; 3; 1)Con il terzo parametro a 1 abbiamo lo stesso tipo di ordinamento, che mantiene tutte le righe.
Vengono elencati al massimo i primi tre risultati primari, come nel modo 0 ma
in aggiunta, se ci sono risultati che sono duplicati dell'ultimo, vengono aggiunti dopo l'ultimo elemento.
Possono quindi essere elencate più di n righe.
Nel caso estremo di righe tutte uguali verrebbero elencate tutte le righe (perché oltre la terza, ce ne sono altre uguali a quest'ultima).
SORTN(A2:C20; 3; 2)Con il tezo parametro a 2, dall'ordinamento vengono escluse le righe duplicate, di conseguenza vengono elencati al massimo 3 risultati.
SORTN(A2:C20; 3; 3)Mentre il modo 1 elence solo i "pari merito" dell'ultima riga, il modo 3 elenca al massimo 3 risultati primari e dopo ciascuno di questi elenca gli eventuali risultati equivalenti.
SORTN(A2:C20; n; modo; 2; VERO)I due nuovi elementi non possono essere scissi uno dall'altro (devono stare in coppia, si possono aggiungere altre coppie).
In questo caso, con
2 si indica a SORTN() di ordinare solo in base alla seconda colonna (la colonna B) e con VERO si imposta l'ordinamento a ascendente.
Attenzione - Gli esempi precedenti operavano l'ordinamento su tutte le colonne e (per questo) consideravano duplicate le righe con identici valori in tutte le colonne.
Se si indicano specifiche colonne per l'ordinamento (una o più), allora SORTN() considera duplicate le righe che hanno i contenuti
di quelle colonne uguali, altrimenti no.
SORTN(A2:C20; n; modo; E2:E20; FALSO)Variazione del caso precedente, dove si specifica, per l'ordinamento, una colonna esterna all'intervallo da ordinare. Occorre che il numero di righe sia lo stesso di quello dell'intervallo da ordinare.
In questo caso, per ordinare le righe dell'intervallo A2:C20 verranno utilizzati i dati presenti in E2:E20, presi in ordine discendente.
SORTN(A2:C20; n; modo; RIF.RIGA(A2:A20); FALSO)Non ho trovato documentazione di questa possibilità che non so se ho scoperto o se ho copiato.
L'uso di RIF.RIGA() produce un risultato utile e (per me) inatteso perché
RIF.RIGA, se usato "liberamente" produce sempre un unico valore, non un array. Normalmente occorre usare una espressione come ARRAYFORMULA(RIF.RIGA(A2:A20)) per ottenere un array. Con SORT pare che il parametro produca una "espansione implicita".
È
come se venisse generato un array {2, 3, 4, 5, 6, 7..., 20} che può essere usato, ordinandolo in ordine decrescente, per capovolgere l'intero intervallo di ingresso.
SORTN(A2:C8; n; modo; {2; 4; 6; 1; 3; 5}; VERO)Anche un array statico può essere usato per ordinare le righe dell'intervallo di ingresso.
In questo caso la quarta riga dell'intervallo originale finirà al primo posto, la prima riga al secondo posto, la quinta riga al terzo posto, e così via.
L'ordinamento può essere ascendente o discendente
Si può scegliere se includere o escludere le righe duplicate
Ma "duplicato" per SORTN() vuol dire che ha le colonne "ordinanti" uguali (le altre possono differire).
SYNTAX
SORTN(RANGE, [N], [DISPLAY_TIES_MODE], [SORT_COLUMN1, IS_ASCENDING1], ...)

Nessun commento:

Posta un commento

NOTA: Attualmente i commenti sono moderati, vale a dire che non compariranno immediatamente. Questo mi consente sia eliminare eventuale spam sia di leggere i messaggi e eventualmente rispondere.