2016-09-27 5 views
10

In Bezug auf die vorherige Frage, die ich geschrieben habe: calculation the difference for same column for the specific rows in SpotfireAnpassung für Gruppe (Expressions) in derselben Spalte in Spotfire

ich ein neues Problem für sie, unten ist die Probe:

enter image description here

die neue Funktion, die ich realisieren will, ist,

  • Suche nach dem nächster nächster TYPE = 0 für TYPE = 1
  • wenn der TYPE = 1 hat nächsten TYPE = 0, markieren Sie es dann als 'T' in einer neuen berechneten Spalte, die auch als NULL

Daten Regeln :

  • der Status Spalte {1,2}, um der Standardwert des Nullraum enthält, ist als der letzte Wert am nächsten Stand über ihm gleich.
  • Typ Spalte enthält nur 0 und 1 zufällig

Ausgabe wie folgt sein sollte:

enter image description here

die Lösung, was ich versucht habe:

If(([type]=1) and (first([type]) OVER (intersect(previous([type]),AllNext([status])))=0),"T",Null) 

es aussieht Gut, aber das Problem ist in jeder Statusgruppe, zum Beispiel der letzte TYPE = 1 (t er 5. Zeile) in der ersten Status = 1 Gruppe, hat es nicht nächste TYPE = 0, so dass das Urteil Null wäre. Aber basierend auf dem Code ist es T! :(

jede Anregung und Idee dazu vielen Dank ' PS:?! Einige Details:

  • der erste Typ Wert des Status NULL ist
  • Andere Nullraum in der Statusspalte kann wie folgt gefüllt werden, wenn es für den Ausdruck :) hilfreich:

enter image description here

+0

dieser ist knifflig. Sind die leeren Werte in Status und Typ Null? – scsimon

+0

ja, aber eigentlich können wir die leeren Werte mit ihrem neuesten Status füllen. :) – ZAWD

+0

@scsimon, habe ich einige Details für die Frage hinzugefügt, jede weitere Frage ist willkommen :) – ZAWD

Antwort

1

Ok, das o Ich habe meine Grenzen wirklich getestet und bin gespannt ob es skalieren wird. Es funktioniert für Ihre Daten, vorausgesetzt, Sie haben NULL. Es dauerte ein paar Stunden, um es herauszufinden.

  1. Legen Sie eine berechnete Spalte RowId() und nennen Sie es RowNum
  2. eine berechnete Spalte es es Rank
  3. Legen Sie eine berechnete Spalte If((first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0,[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum])))) und nennen Sie es RankReal([status],"ties.method=first") und Name Legen GroupOfTypes
  4. Inert eine berechnete Spalte If([type]>Min([type]) over (Intersect([GroupOfTypes],AllNext([RowNum]))),"T") und Namen Marking.Das ist die Zeile, die dir wirklich wichtig ist.

Ergebnisse

enter image description here

ERKLÄRUNG

RankReal([status],"ties.method=first")

Dies geschieht, um im wesentlichen eine pseudo RowNumber zu erzeugen auf einem Segment von Zuständen basiert. Sie werden sehen, dass es basierend auf dem Status nacheinander sortiert wird. Es ist der erste Schritt in meiner Methode, um Ihre Daten zu gruppieren.

If((first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0,[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum]))))

Der erste Teil dieser, (first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0 prüft, ob die die gleiche wie die aktuelle Zeile ist [status] Spalte vorherigen Zeile. Wenn dies der Fall ist, wird ein boolescher Wert TRUE zurückgegeben. Wenn es der vorherigen Zeile entspricht, wissen wir, dass es in denselben Block/dieselbe Gruppierung gehört. Daher berechnen wir diese Spalte mit dem gleichen Wert für den gesamten Block. Das ist [Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum]))). Daher entspricht jede Zeile innerhalb unserer Gruppierung dem gleichen Wert.

If([type]>Min([type]) over (Intersect([GroupOfTypes],AllNext([RowNum]))),"T")

Schließlich bewerten wir, wenn die [type] größer als der mnimal ist [type] über alle die nächsten Zeilen, basierend auf dem rownumber. Dies beschränkt die Daten, auf die wir uns konzentrieren, auf jene, bei denen [type] = 1 tatsächlich die Zeilen nicht filtert, während nur vorwärts im Dataset gesucht wird. Wenn das wahr ist, kennzeichnen wir es mit T.

+0

wirklich so leid für die Verzögerung !!! habe ein paar Probleme, die ohne Internet in letzter Zeit – ZAWD

+0

Keine Sorgen @ ZAWD passiert. Es ist eine populäre Frage geworden, wie Sie sehen können :) – scsimon

+0

war ich so für es auch so überrascht :) – ZAWD

1

@ZAWD - Eine andere Möglichkeit, dies zu lösen.

Schritt 1: eine RowID unter Verwendung des Ausdrucks RowId()

Schritt 2 erstellt: eine berechnete Spalte erstellt 'Mark0' den Ausdruck unten. Dieser Schritt ist zu finden, dass der aktuelle Typ nicht 0 ist und sein fortlaufender Typ 0 ist.

Hinweis: Diese Spalte wird im Hintergrund ausgeführt. Muss nicht in der Tabelle enthalten sein. Auch 100 ist einig Dummy-Wert, der nur dann verwendet wird, um sicherzustellen, dass die Bedingung

If((Sum([type]) over ([RowID])!=0) and (Sum([type]) over (Next([RowID]))=0),100) 

Schritt 3 erfüllt ist: Erstellt eine berechnete Spalte ‚Mark1‘ unter Verwendung des Ausdrucks unten. Dieser Schritt ist zu finden, dass der aktuelle Typ nicht 0 ist und sein fortlaufender Typ ist auch nicht 0 und Mark0 ist gefüllt.

Hinweis: Diese Spalte wird im Hintergrund ausgeführt.Benötigen Sie nicht in der Tabelle

If((Sum([type]) over ([RowID])!=0) and (Sum([type]) over (Next([RowID])) Is Not Null) and (first([Mark0]) over (allNext([RowID]))=100),100) 

Schritt 4 aufgenommen werden: Schließlich erstellt 'Endnote' Spalte unter Verwendung des Ausdrucks unter dem

If(([Mark0]=100) or ([Mark1]=100),"T",null) 
100 in Mark0 und Mark1 Spalten als 'T' markiert

Final Table:

nearest ich dies mit Ihren Daten getestet sowie verschiedene Szenario S wie drei aufeinanderfolgende 1s in 'Typ' Spalte statt zwei und scheint gut zu funktionieren. Bitte testen Sie es und lassen Sie mich wissen, wenn dies stabil ist.

+0

hallo großer Dank für die Antwort, ich habe die Lösung getestet, es funktioniert super !!!! – ZAWD

+0

Gern geschehen! – ksp585

Verwandte Themen