Hallo JSL-Experten,
Ich habe ein großes Problem, den Wert 2nd max, 3rd max usw. in 1 Spalte zu finden.
Für eine Spalte unten hoffe ich, den Top-5-Maximalwert zu identifizieren und den Wert in einer separaten Spalte zu markieren.
Es scheint, dass ich nur den Col max finden kann, aber große Schwierigkeiten habe, den 2nd max, 3rd max usw.
Gibt es eine Standardformel für diese Lösung?
Vielen Dank
(100,
232,
343,
121,
100,
132,
100,
100,
100,
100,)
Hallo,
Dies hängt davon ab, was Sie mit "max" meinen und ob Sie bereit sind, die Tabelle zu sortieren. Ich werde einige häufige Fälle ansprechen und hoffen, dass einer davon Ihren Anwendungsfall abdeckt.
Fall 1: "max" bedeutet Position im sortierten Datensatz von Originalwerten, einschließlich Duplikaten.
Dazu können Sie eine integrierte Transformation verwenden. Klicken Sie mit der rechten Maustaste auf Daten in der interessierenden Spalte und wählen Sie Neue Formelspalte > Verteilung > Rang (umgekehrte Reihenfolge).
Wenn wir auf die erstellte Formel klicken, haben wir Folgendes, was unabhängig davon funktioniert, ob die Tabelle sortiert ist oder nicht:
(Col Number( :Col1 ) - Col Rank( :Col1 )) + 1

Fall 2: "Max" bedeutet Position im sortierten Satz von EINZIGARTIGEN Werten (keine Duplizierung). Nicht bereit, Daten vorzusortieren.
***Hinweis: Aufgrund seiner Abhängigkeit von assoziativen Arrays funktioniert dieser Ansatz nur mit numerischen Daten mit höchstens einer Dezimalstelle.
Wir können die verworrene (und teure) Formel verwenden:
Loc(
Matrix(
Reverse(
Associative Array( (:Col1 << get data table) :: col1 << getvalues ) << get keys
)
),
:Col1
)
Diese Formel bewirkt Folgendes:
1) Ruft die Werte aus der interessierenden Spalte ab und übergibt sie an ein assoziatives Array, das Duplikate entfernt.
2) Ruft die assoziativen Array-Schlüssel ab (standardmäßig von niedrig nach hoch) und kehrt ihre Reihenfolge um.
3) Verwendet die Funktion Loc(), um die Position der gegebenen Zeile innerhalb der Matrix der umgekehrten assoziativen Arrayschlüssel zu melden.
Fall 3: Wie in Fall 2, aber wir sind bereit, nach der interessierenden Spalte vorzusortieren (absteigend).
In diesem Fall können wir eine einfachere und effizientere, wenn auch selbstreferenzielle Formel verwenden:
If( Row() == 1,
1,
Lag( :Formula3 ) + (Lag( :Col1 ) != :Col1)
)
Unten sehen wir den Unterschied zwischen der ersten Formel und den nächsten beiden. Auch hier ist nur die 3. Formel von der Tabellensortierung abhängig.

Wenn Sie dies ausprobieren möchten, führen Sie das folgende Skript aus. Es erscheint zunächst unsortiert, aber nach einer Pause von einer Sekunde wird nach Spalte 1 sortiert, wobei die Ergebnisse der dritten Formel mit den Ergebnissen der zweiten übereinstimmen.
dt = New Table( "Example",
Add Rows( 20 ),
New Column( "Col1", <<SET values=""></SET>
Prost,
Brady