Ciao esperti JSL,
Ho un grosso problema a trovare il valore 2nd max, 3rd max ecc in 1 colonna.
Per una colonna di seguito, spero di identificare i primi 5 valori massimi e contrassegnare il valore in una colonna separata.
Sembra che riesca a trovare solo il col max, ma ho molte difficoltà a trovare il 2nd max, il 3rd max ecc.
Esiste una formula standard per questa soluzione?
Grazie
(100,
232,
343,
121,
100,
132,
100,
100,
100,
100,)
Ciao,
Questo dipende da cosa intendi per "max" e se sei disposto a ordinare la tabella. Tratterò alcuni casi comuni e spero che uno di essi copra il tuo caso d'uso.
Caso 1: "max" indica la posizione nel set di dati ordinato dei valori originali, inclusi i duplicati.
Puoi usare una trasformazione incorporata per questo. Fare clic con il pulsante destro del mouse sui dati nella colonna di interesse e selezionare Nuova colonna formula > Distribuzionale > Classifica (ordine inverso).
Cliccando sulla formula che viene creata, abbiamo quanto segue, che funziona indipendentemente dal fatto che la tabella sia ordinata o meno:
(Col Number( :Col1 ) - Col Rank( :Col1 )) + 1

Caso 2: "Max" significa posizione in un insieme ordinato di valori UNIQUE (nessuna duplicazione). Non disposto a preordinare i dati.
***Nota: a causa della sua dipendenza da array associativi, questo approccio funziona solo con dati numerici che hanno al massimo una cifra decimale.
Possiamo usare la formula contorta (e costosa):
Loc(
Matrix(
Reverse(
Associative Array( (:Col1 << get data table) :: col1 << getvalues ) << get keys
)
),
:Col1
)
Questa formula fa quanto segue:
1) Ottiene i valori dalla colonna di interesse e li passa a un array associativo, che rimuove i duplicati.
2) Ottiene le chiavi dell'array associativo (in ordine dal basso verso l'alto per impostazione predefinita) e inverte il loro ordine.
3) Utilizza la funzione Loc() per riportare la posizione della riga data all'interno della matrice di chiavi array associative invertite.
Caso 3: Come nel caso 2, ma siamo disposti a preordinare (discendente) dalla colonna di interesse.
In questo caso possiamo utilizzare una formula più semplice ed efficiente, seppur autoreferenziale:
If( Row() == 1,
1,
Lag( :Formula3 ) + (Lag( :Col1 ) != :Col1)
)
Di seguito, vediamo la differenza tra la prima formula e le due successive. Anche in questo caso, solo la terza formula dipende dall'ordinamento delle tabelle.

Se vuoi provarlo, esegui lo script qui sotto. Inizialmente appare non ordinato, ma dopo una pausa di un secondo, viene ordinato per col1, a quel punto i risultati della terza formula corrisponderanno ai risultati della seconda.
dt = New Table( "Example",
Add Rows( 20 ),
New Column( "Col1", <<SET values=""></SET>
Saluti,
Brady