Hallo!
Ich habe eine Datentabelle, die über ein Skript erstellt wurde, das zwei separate Abfragen ausführt (die Daten aus zwei verschiedenen Quellen bereitstellen), die dann zu einer Datentabelle zusammengeführt werden. Meine Frage betrifft die tägliche Aktualisierung dieser Tabelle, sodass das Skript nicht von Anfang an erneut ausgeführt werden muss und alle Bereinigungen/Anpassungen/neuen Spalten beibehalten werden können. Ich sehe in der Seitenleiste sowohl „Update von Datenbank“ als auch „Update von Datenbank2“. Ich kann eine davon ausführen, aber sie löscht die Spalten, die nicht in dieser Quelle enthalten sind (d. h. wenn ich „Aus Datenbank aktualisieren“ ausführe, was für die erste Abfrage gilt, werden die Spalten TVC, VI, AC und DC gelöscht aus Abfrage 2 zusammen mit anderen Berechnungs-/manuellen Eingabespalten, die ich der Tabelle nach dem Zusammenführen im Originalskript hinzufüge).
Ich habe versucht, die beiden Update-Skripte zusammen in ein Skript zu kopieren (siehe unten), habe aber das Problem, dass beim Ausführen des ersten Skripts versucht wird, die Spalten zu löschen, bevor das zweite ausgeführt wird. Ich bin mir nicht sicher, ob es der beste Ansatz wäre, die Tabellen zu kombinieren und dann zu versuchen, sie zu aktualisieren, oder ob es etwas Einfacheres gibt (vielleicht eine Möglichkeit, sie zu aktualisieren, ohne Daten zu löschen, die nicht aus dieser Quelle stammen)? Ich habe die Verbindungsinformationen entfernt und die Namen im Code unten geändert, aber hoffentlich hilft dies dabei, eine Vorstellung zu vermitteln. Hat jemand schon einmal mit einem ähnlichen Problem zu tun gehabt? Danke!
New SQL Query(
Version( 130 ),
Connection(
""
),
QueryName( "query1" ),
Select(
Column( "Assay", "t1" ),
Column( "Experiment", "t1" ),
Column( "Date", "t1", Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) ),
Column( "G", "t1" ),
Column( "L", "t1" ),
Column( "N", "t1" ),
Column( "K", "t1" ),
Column( "C", "t1" ),
Column( "H", "t1" ),
Column( "O", "t1" ),
Column( "C", "t1" ),
),
From( Table( "Runs", Schema( "schema1" ), Alias( "t1" ) ) ),
Where(
Contains(
Column( "Experiment", "t1" ),
"E001",
UI(
Contains(
Base(
"Categorical",
Prompt(
"Experiment ID:",
Character,
PromptName( "t1.Experiment_1" )
)
)
)
)
) & Does Not Contain(
Column( "Assay, "t1" ),
"xxx",
UI(
Contains(
Base(
"Categorical",
Prompt(
"Add a filter for names (optional) or put xxx:",
Character,
PromptName( "t1.AssayId_1" )
)
)
)
)
) & GE(
Column(
"Date",
"t1",
Numeric Format( "m/d/y h:m:s", "0", "NO", "" )
),
0,
UI(
Comparison(
Base(
"Continuous",
Prompt(
"Date range:",
Character,
PromptName( "t1.RunDate_1" )
)
)
)
)
)
)
) << Run Foreground( UpdateTable( Current Data Table() ) );
New SQL Query(
Version( 130 ),
Connection(
""
),
QueryName( "query2" ),
Select(
Column( "Assay", "t2" ),
Column( "Experiment", "t2" ),
Column( "Date", "t2", Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) ),
Column( "TVC", "t2" ),
Column( "VI", "t2" ),
Column( "AC", "t2" ),
Column( "AD", "t2" )
),
From( Table( "Runs", Schema( "schema2" ), Alias( "t2" ) ) ),
Where(
Contains(
Column( "Experiment", "t2" ),
"E001",
UI(
Contains(
Base(
"Categorical",
Prompt(
"Experiment ID:",
Character,
PromptName( "t2.Experiment_1" )
)
)
)
)
) & Does Not Contain(
Column( "Assay", "t2" ),
"xxx",
UI(
Contains(
Base(
"Categorical",
Prompt(
"Add a filter (optional) or put xxx:",
Character,
PromptName( "t2.AssayId_1" )
)
)
)
)
) & GE(
Column(
"Date",
"t2",
Numeric Format( "m/d/y h:m:s", "0", "NO", "" )
),
0,
UI(
Comparison(
Base(
"Continuous",
Prompt(
"Date range:",
Character,
PromptName( "t2.RunDate_1" )
)
)
)
)
)
)
) << Run Foreground( UpdateTable( Current Data Table() ) )
Ich bin mir ziemlich sicher, dass Sie sehen, dass Sie beim Hinzufügen von Spalten zu einer Tabelle, die aus einer neuen SQL-Abfrage erstellt wurde, eine neue Datentabelle erhalten, wenn Sie eine Aktualisierung aus der Datenbank durchführen. Das heißt, Sie können die importierte Tabelle nicht wiederverwenden, da Sie die Metadaten (hinzugefügte Spalten) geändert haben.
Ich denke, was Sie tun können, ist, Ihre beiden Tabellen aus der/den Datenbank(en) zu importieren, indem Sie den Datei->Datenbank->Query Builder verwenden (speichern Sie die Datentabellen nicht). Führen Sie dann den Tabellen->JMP Query Builder aus, um die beiden Tabellen zu kombinieren . Es wird ungefähr so aussehen:
New SQL Query(
Version( 130 ),
Connection( "JMP" ),
JMP Tables(
["Big Class Families" =>
"Source(New SQL Query(
Connection(
""
),
QueryName( \!"Big Class Families\!" ),
Select,
From( Table( \!"Big Class Families\!", Schema( \!"SQBTest\!" ), Alias( \!"t1\!" ) ) )
) << Run Foreground)",
"g4_bigclass" =>
"Source(New SQL Query(
Connection(""),
QueryName( \!"g4_bigclass\!" ),
Select,
From( Table( \!"g4_bigclass\!", Schema( \!"SQBTest\!" ), Alias( \!"t1\!" ) ) )
) << Run Foreground)"
]
),
QueryName( "SQLQuery3" ),
Select(
Column( "picture", "t1" ),
Column( "name", "t1" ),
Column( "age", "t1" ),
Column( "sex", "t1" ),
Column( "height", "t1" ),
Column( "weight", "t1" ),
Column( "sibling ages", "t1" ),
Column( "sports", "t1" ),
Column( "countries visited", "t1" ),
Column( "family cars", "t1" ),
Column( "reported illnesses", "t1" ),
Column( "age vector", "t1" ),
Column( "pet", "t1" ),
Column( "name", "t2", Alias( "name 2" ) ),
Column( "age", "t2", Alias( "age 2" ) ),
Column( "sex", "t2", Alias( "sex 2" ) ),
Column( "height", "t2", Alias( "height 2" ) ),
Column( "weight", "t2", Alias( "weight 2" ) )
),
From(
Table( "Big Class Families", Alias( "t1" ) ),
Table(
"g4_bigclass",
Alias( "t2" ),
Join(
Type( Left Outer ),
EQ( Column( "name", "t2" ), Column( "name", "t1" ) ) &
EQ( Column( "age", "t2" ), Column( "age", "t1" ) ) &
EQ( Column( "sex", "t2" ), Column( "sex", "t1" ) ) &
EQ( Column( "height", "t2" ), Column( "height", "t1" ) ) &
EQ( Column( "weight", "t2" ), Column( "weight", "t1" ) )
)
)
)
) << Run;
Was passiert, ist, dass der JMP Query Builder das Quellskript aus jeder nicht gespeicherten Tabelle abruft, um sein Skript zu erstellen. Das bedeutet, dass das Skript „Neue SQL-Abfrage“ jedes Mal, wenn es ausgeführt wird, neue Daten aus den Datenquellen in jeder der abhängigen Tabellen einbringt.