2016-09-27 1 views
10

En ce qui concerne la question précédente que j'ai posté: calculation the difference for same column for the specific rows in Spotfirecorrespondant pour le groupe (Expressions) dans la même colonne dans Spotfire

J'ai un nouveau problème pour elle, au-dessous est l'échantillon:

enter image description here

la nouvelle fonction que je veux réaliser est,

  • recherche de la suivant le plus proche TYPE = 0 pour TYPE = 1
  • si le type = 1 a la plus proche TYPE = 0, puis marquer comme 'T' dans une nouvelle colonne calculée, sinon NULL

Règles de données :

  • Statut colonne contient {1,2} dans l'ordre, la valeur par défaut de l'espace nul est identique à la dernière valeur d'état le plus proche au-dessus.
  • type colonne contient seulement 0 et 1 au hasard

sortie devrait ressembler à ceci:

enter image description here

la solution ce que j'ai essayé:

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

il semble bien, mais le problème est dans chaque groupe de statut, par exemple le dernier TYPE = 1 (t 5ème ligne) dans le premier groupe de statut = 1, il n'a pas le prochain TYPE = 0, donc le jugement serait nul. Mais basé sur le code, c'est T! :(

toute suggestion et idée de ce merci lot ' PS:! Quelques détails:

  • le premier type Valeur de l'état est NULL
  • Autre espace null dans la colonne d'état peut être rempli comme ci-dessous, si elle est utile pour l'expression :):

enter image description here

+0

celui-ci est difficile. Les valeurs vides dans status et type sont-elles nulles? – scsimon

+0

oui, mais en fait, nous pouvons remplir les valeurs vides avec son dernier statut. :) – ZAWD

+0

@scsimon, j'ai ajouté quelques détails pour la question, toute autre question est la bienvenue :) – ZAWD

Répondre

1

Ok, cette o J'ai vraiment testé mes limites et je suis curieux de savoir si cela va évoluer. Cela fonctionne pour vos données, étant donné que vous avez NULL. Il a fallu quelques heures pour comprendre.

  1. Insérer une colonne calculée RowId() et nommez-le RowNum
  2. Insérer une colonne calculée RankReal([status],"ties.method=first") et nommez-le Rank
  3. Insérer une colonne calculée If((first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0,[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum])))) et nommez-le GroupOfTypes
  4. Inert une colonne calculée If([type]>Min([type]) over (Intersect([GroupOfTypes],AllNext([RowNum]))),"T") et nommez-le Marking.C'est la rangée dont vous vous souciez vraiment.

Résultats

enter image description here

EXPLICATION

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

Ceci est fait pour créer essentiellement un pseudo rownumber basé sur un segment des statuts. Vous verrez les classements en fonction du statut, séquentiellement. C'est la première étape de ma méthode pour regrouper vos données.

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

La première partie de ce, (first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0 évalue si [status] colonne de la ligne précédente est la même que la ligne courante. Si c'est le cas, il renvoie une valeur booléenne TRUE. Si c'est la même chose que la rangée précédente, nous savons qu'il appartient au même bloc/groupement, nous faisons donc des maths pour étiqueter cette colonne avec la même valeur pour tout le bloc. C'est [Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum]))). Par conséquent, chaque ligne de notre groupe équivaudra à la même valeur.

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

Enfin nous évaluons si la [type] est plus grande que la mnimal [type] sur toutes les lignes suivantes, en fonction de la rownumber. Cela limite les données sur lesquelles nous nous concentrons à ceux où [type] = 1 sans réellement filtrer les lignes, tout en recherchant seulement avant dans l'ensemble de données. Si cela est vrai, nous le signalons avec T.

+0

vraiment tellement désolé pour le retard !!! avoir des problèmes que sans Internet récemment – ZAWD

+0

Pas de soucis @ZAWD il arrive. Il est devenu une question populaire comme vous pouvez le voir :) – scsimon

+0

j'ai été tellement surpris pour cela aussi :) – ZAWD

1

@ZAWD - Une autre façon de résoudre ce problème.

Etape 1: créé un RowID en utilisant l'expression RowId()

Etape 2: Crée une colonne calculée 'Mark0' en utilisant l'expression ci-dessous. Cette étape consiste à trouver que le type courant n'est pas 0 et que son type consécutif est 0.

Remarque: Cette colonne s'exécute en arrière-plan. Ne doit pas être inclus dans le tableau. En outre, 100 est une valeur fictive qui est utilisée uniquement pour faire en sorte que la condition est satisfaite

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

Étape 3: Créé une colonne calculée « Mark1 » en utilisant l'expression ci-dessous. Cette étape consiste à trouver que le type courant n'est pas 0 et que son type consécutif n'est pas égal à 0 et que Mark0 est rempli.

Remarque: Cette colonne s'exécute en arrière-plan.N'a pas besoin d'être inclus dans la table

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

Étape 4: Enfin, créé colonne 'note finale' en utilisant l'expression ci-dessous qui marque 100 dans les colonnes Mark0 et Mark1 comme 'T'

If(([Mark0]=100) or ([Mark1]=100),"T",null) 

Table finale:

nearest Je l'ai testé avec vos données, ainsi que différents scénarios s comme trois 1 consécutifs dans la colonne «type» au lieu de deux et semble fonctionner correctement. S'il vous plaît tester et laissez-moi savoir si cela est stable.

+0

salut grand merci pour la réponse, j'ai testé la solution, ça marche super !!!! – ZAWD

+0

Vous êtes les bienvenus! – ksp585