Hallo, ich benötige Hilfe bei der Bereinigung einiger Daten. Die Daten in der Tabelle enthalten mehrere IDs, Daten und Kategorien. Ich interessiere mich für IDs mit der Kategorie 1 und 2, oder 1 und 2 und 3, oder 1 und 3, wobei ich für jede Kategorie nur die Einträge mit dem maximalen Datum behalte. Könnten Sie bitte das beste Skript für diese Lösung bereitstellen? Danke schön!
| AUSWEIS | Kategorie | Datum | KostenA | KostenB | KostenC | KostenD |
| 1 | 1 | 21.01.16 | 5000 | 0 | 3000 | 500 |
| 1 | 1 | 21.01.16 | 1000 | 5000 | 10000 | 0 |
| 1 | 1 | 21.01.16 | 20000 | 0 | 10 | 50 |
| 1 | 2 | 22.01.16 | 3000 | 0 | 0 | 50000 |
| 1 | 3 | 01.02.16 | 1 | 10 | 900 | 0 |
| 2 | 1 | 02.04.13 | 0 | 100 | 10000 | 5000 |
| 2 | 2 | 03.04.13 | 0 | 0 | 0 | 642,49 |
| 2 | 1 | 02.04.13 | 1 | 10 | 900 | 0 |
| 3 | 2 | 06.03.15 | 50 | 0 | 0 | 259,58 |
Hier ist ein kleines Skript, das funktionieren sollte. Es findet die Zeilen, die Ihrer Definition entsprechen. Diese Zeilen werden dann in eine neue Tabelle unterteilt.
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
If( :date == Col Maximum( :date, :ID ),
currID = :ID;
//currID="1"
cats = Associative Array( dt:category[dt << get rows where( :ID == currID )] ) << get keys;
If( cats[1] == "1" & Length( cats ) > 1,
dt << select rows( Row() )
);
)
);
dtNew = dt << subset( selected columns(0), selected rows(1),
output table("Final")
);
// The above code will allow multiple rows within a given ID, when there are
// multiple rows with the same maximum date. Run the below code to
// get rid of the multiple entries, if that is what is desired
dtNew << select duplicate rows(Match(:ID));
dtNew << delete rows;


Wenn die letzten beiden Zeilen des obigen Skripts ausgeführt werden, werden die doppelten ID-Zeilen gelöscht.

Jim,
Ich danke Ihnen für Ihre Hilfe. Ich entschuldige mich für etwaige Verwirrung. Ich benötige jede ID, die in der Abschlusstabelle der Kategorie 1 und 2 und/oder 3 angehören muss. Wenn es wiederholte IDs mit derselben Kategorie gibt, benötige ich die Zeile mit dem maximalen Datum. Die Tabelle sollte hier bereitgestellt werden. Danke im Voraus für Ihre Hilfe.
| AUSWEIS | Kategorie | Datum | KostenA | KostenB | KostenC | KostenD |
| 1 | 1 | 21.01.16 | 20000 | 0 | 10 | 50 |
| 1 | 2 | 22.01.16 | 3000 | 0 | 0 | 50000 |
| 2 | 1 | 02.04.13 | 0 | 100 | 10000 | 5000 |
| 2 | 2 | 03.04.13 | 0 | 0 | 0 | 642,49 |
| 3 | 1 | 06.03.15 | 3000 | 0 | 0 | 817 |
| 3 | 2 | 06.03.15 | 50 | 0 | 0 | 259,58 |
| 4 | 1 | 06.03.15 | 10000 | 0 | 0 | 710.16 |
| 4 | 2 | 06.03.15 | 5000 | 0 | 0 | 1087 |
| 4 | 3 | 16.03.15 | 0 | 0 | 0 | 326,7 |
Mein Beispiel von oben hatte „Kategorie“ als Zeichenspalte. Ihr Beispiel ist numerisch. Außerdem habe ich die Logik geändert, um sicherzustellen, dass es mindestens die Kategorien 1&2, 1&3 oder 1&2&3 gibt
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
If( :date == Col Maximum( :date, :ID ),
currID = :ID;
cats = Associative Array( dt:category[dt << get rows where( :ID == currID )] ) << get keys;
show(cats);
If( Length( cats ) > 1,
If( cats[1] == 1 & (cats[2] == 2 | cats[2] == 3),
dt << select rows( Row() )
)
);
)
);
dtNew = dt << subset( selected columns( 0 ), selected rows( 1 ), output table( "Final" ) );
Hier ist eine Möglichkeit, wie Sie dies mit Col-Funktionen erreichen können
Names Default To Here(1);
dt = New Table("Untitled 3",
Add Rows(11),
Compress File When Saved(1),
New Column("ID", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1, 1, 2, 3, 3, 4, 4, 4, 4, 4])),
New Column("Category", Character, "Nominal", Set Values({"A", "A", "B", "A", "A", "C", "A", "A", "B", "B", "C"})),
New Column("Date", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1]))
);
dt << New Column("KEEP", Numeric, Nominal, Formula(
Col Sum(Row() == Col Min(Row(), :category, :id), :id) > 1 & :date == Col Max(:date, :category, :id)
));
Ändern Sie die Formel in << „Wo auswählen“ / << „Zeilen wo abrufen“ oder verwenden Sie sie mit einer Teilmenge, um die Zeilen zu übernehmen, die Sie behalten möchten.

Bearbeiten:
In der Originalversion wurde nicht berücksichtigt, dass Kategorie 1 fehlen könnte (dies setzt voraus, dass es sich bei der Kategorie um eine numerische Spalte handelt).
New Column("KEEP", Numeric, Nominal, Formula(
Col Sum(Row() == Col Min(Row(), :category, :id), :id) > 1
& :date == Col Max(:date, :category, :id)
& Col Sum(If(:category == 1, 1, .), :id)
));