Come definire una nuova colonna in base alla condizione di n righe consecutiveCiao a tutti,
Sto cercando una colonna formula in cui i suoi elementi dipendano dalle almeno 10 righe consecutive di un'altra colonna che riempiono completamente un valore di soglia. Si prega di vedere l'immagine e i dati allegati. Questi includono anche la colonna richiesta "Correggi regione fallita".
Qualsiasi aiuto per favore.
Grazie HSS

ScriptingRi: Come definire una nuova colonna in base alla condizione di n righe consecutiveForse dividerei l'algoritmo in tre parti:
- Aumenta il contatore quando ci sono valori sufficienti oltre 750 (possibilmente imposta alcune variabili di supporto)
- Aumenta il contatore quando c'è anche un solo valore inferiore a 750 DOPO e fallo solo UNA VOLTA per ogni passaggio 1. aumenta (possibilmente imposta alcune variabili di supporto)
- Non aumentare il contatore (eventualmente impostare alcune variabili di supporto)
questo potrebbe essere più semplice (forse non più semplice, ma più chiaro) da fare con alcune variabili di supporto aggiuntive.
Forse qualcosa del genere:
If(Row() == 1,
counter = 1;
allow_over_limit_change = 1;
allow_below_limit_change = 0;
);
current_vals_to_check = :Current[Row()::Min(Dim()[1], Row() + 9)];
over_limit_count = Sum(current_vals_to_check >= 750);
If(allow_over_limit_change & over_limit_count >= 10,
counter++;
allow_below_limit_change = 1;
allow_over_limit_change = 0;
, allow_below_limit_change & :Current < 750,
counter++;
allow_below_limit_change = 0;
allow_over_limit_change = 1;
);
counter;
Row() == 1 istruzione if può molto probabilmente essere sostituita con questa (secondo me non così chiara come usare l'istruzione If)
As Constant(counter = 1);
As Constant(allow_over_limit_change = 1);
As Constant(allow_below_limit_change = 0);
Ri: Come definire una nuova colonna in base alla condizione di n righe consecutiveCiao @jthi ,
Ho provato qualcosa sul mio nuovo requisito. Potrebbe non essere la soluzione migliore, ma è una soluzione. Ed è molto vicino alla soluzione che hai suggerito per il problema originale. Fino ad ora sta funzionando bene.
If( Row() == 1, val = 1 );
Next_10_values = Sum( :Current[Index( Row(), Min( Dim()[1], Row() + 9 ) )] >= 750 );
Previous_10_values = Sum( :Current[Index( Row(), Min( Dim()[1], Row() - 9 ) )] >= 750 );
If(
Next_10_values == 10 & Lag( :Current ) < 750 | Previous_10_values == 9 & :Current < 750 &
Lag( :Current ) >= 750,
val = val + 1
);
val;
molte grazie per il vostro sostegno!
Saluti, SS
Ri: Come definire una nuova colonna in base alla condizione di n righe consecutiveChange viene utilizzato per aumentare val se necessario. Per il problema tre, richiederebbe una riscrittura dell'algoritmo poiché le condizioni sono cambiate
Ri: Come definire una nuova colonna in base alla condizione di n righe consecutive@jthi Grazie per la spiegazione.
L'ho eseguito riga per riga e ho ottenuto un bel po '.
Ancora non ho idea del perché abbiamo un "cambiamento" variabile nella sceneggiatura e qual è il suo scopo? Prende solo due valori, 1 (come valore impostato) e 0 ogni volta che otteniamo più di 10 voci di fila con un valore corrente soddisfacente. Ma non appare da nessuna parte nella nuova indicizzazione delle colonne. Ma se lo eseguo senza la variabile "Change" non ottengo voci corrette. Ma non sono in grado di capire come e dove influisce sul nostro calcolo/indicizzazione.
e la terza parte del problema: come posso aumentare l'indice di esecuzione quando termina la regione desiderata di :current>=750?
grazie, SS
Ri: Come definire una nuova colonna in base alla condizione di n righe consecutiveQuello che suggerirei di fare è modificare lo script in qualcosa di simile che ti permetterà di eseguirlo "riga per riga":
// Names Default To Here(1);
// Clear Log();
dt = Current Data Table();
run_script = Expr(
If(Row() == 1,
val = 1; // this is breaking rule of > 750, so we define it separately
change = 1;
);
next_vals = :Current[Row()::Min(Dim()[1], Row() + 9)];
over_limit = Sum(next_vals >= 750);
If(change & over_limit >= 10,
val++;
change = 0;
, over_limit < 10,
change = 1;
);
val;
show(row(), val, change, next_vals, over_limit);
Write("\!N");
);
Row() = 1;
run_script;
Row() = 2;
run_script;
Row() = 5;
run_script;
Quindi puoi eseguire abbastanza facilmente lo script in parti e guardare il registro per vedere cosa succede (puoi anche eseguire una riga alla volta se lo desideri).
Finestra script e registro incorporato:

Scripting Index è utile anche per spiegare le funzioni, come Dim().
Se questo non ti è di aiuto, per favore commenta questo post e taggami, posso provare a spiegarlo in modo più dettagliato.
Ri: Come definire una nuova colonna in base alla condizione di n righe consecutiveC'è un errore nell'immagine allegata nel messaggio precedente. Si prega di ignorare l'ultimo rettangolo rosso, poiché per errore ho modificato anche il contatore per il vecchio requisito. Non dovrebbe essere così.
grazie, SS
Ri: Come definire una nuova colonna in base alla condizione di n righe consecutiveCiao Jarmo e tutti,
Questo codice funziona bene e sono in grado di implementarlo perfettamente nello script.
Ma d'altra parte, non sono in grado di capirlo. Voglio modificarlo un po 'ma non sono in grado di farlo. Per favore, mi aiuteresti in questo -
1. Cosa sta facendo questa affermazione -
next_vals = :Current[Row()::Min(Dim()[1], Row() + 9)];
2. Non riesco a capire dove sta avvenendo l'incremento sul 'cambio' e come può essere soddisfatto questo condizionale?
If(change & over_limit >= 10,
Credo che sia uguale a - "If( change >=10 & over_limit >=10
3. Nel mio problema attuale, vorrei aumentare il contatore di uno una volta terminata la regione desiderata (con un minimo di 10 voci) - qualcosa del genere -

Qualsiasi aiuto ?
grazie, SS
Ri: Come definire una nuova colonna in base alla condizione di n righe consecutiveGrazie Jarmo,
Funziona perfettamente. Ora devo integrare questo nel mio script. Spero di poterlo fare.
grazie, SS
Ri: Come definire una nuova colonna in base alla condizione di n righe consecutiveAbbonamento tabella dati è un'opzione.
Ho cambiato il nome della colonna corrente:
Names Default To Here(1);
dt = Current Data Table();
dt << New Column("a", Numeric, Ordinal,
<< Set Each Value(
If(Row() == 1,
val = 1; // this is breaking rule of > 750, so we define it separately
change = 1;
);
next_vals = :Current[Row()::Min(Dim()[1], Row() + 9)];
over_limit = Sum(next_vals >= 750);
If(change & over_limit >= 10,
val++;
change = 0;
, over_limit < 10,
change = 1;
);
val;
)
);