Abfrage-Generator – Eindeutige Datensätze<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo ,
Nach einigem persönlichem Ringen um die Lösung meines Problems habe ich beschlossen, es als Frage an den Benutzer und die JMP-Community zu posten.
Verfügen Sie über eine Datenbank, aus der p1, p2, Asset und Zeit entnommen werden. Bei der Datenbank handelt es sich um eine akkumulierende Datenbank, was bedeutet, dass die Parameter p1 und p2 so geladen werden, dass sie jeweils den letzten Status darstellen Anlage zu einem bestimmten Zeitpunkt Zeit . Mit anderen Worten: Frühere ältere Instanzen von p1 und p2 sind ungültig und die neuesten Versionen von p1 und p2 werden für einen gegebenen Zeitpunkt benötigt Anlage spätestens gemeldet Zeit .
Daher brauche ich eine absteigende Reihenfolge über Zeit und dann erzwingen, dass das Ergebnis eindeutig ist Anlage eben.
Irgendwelche Ideen, wie ich dies im Abfrage-Builder steuern muss?
Ich bevorzuge lieber eine Lösung, indem ich kein benutzerdefiniertes SQL verwende.... Ich habe tatsächlich eine Lösung bei Custom SQL, aber ich lerne gerne, wie man das im Query Builder macht, da ich noch ein paar weitere Teile hinzufügen werde, die in Custom SQL schwierig zu machen sind
Schätzen Sie die Hilfe.
Altug Bayram
Betreff: Abfrage-Generator – Eindeutige DatensätzeDies ist ein alter Beitrag, aber hier geht es weiter:
@altug_bayram schrieb:
Ich habe vergessen hinzuzufügen ...
Der Grund dafür, dass ich Ihre Abfrage ursprünglich nicht zum Laufen bringen konnte, liegt darin, dass ich nicht richtig auf die Datenbank verwiesen habe. Nachdem wir das getan hatten, funktionierte es
Wie war die richtige Vorgehensweise? Außerdem erhalte ich die Fehlermeldung „FEHLER: Beziehung „databases_enzyme_db“ existiert nicht; Fehler beim Vorbereiten der Parameter [SQLSTATE=42P01]“ und ich bin mir nicht sicher, wie ich das Problem beheben soll
Betreff: Abfrage-Generator – Eindeutige DatensätzeFreut mich.Dieser Thread hat mein Verständnis von Unterabfragen wirklich verbessert.Ich habe viel gelernt.
Aufpassen,
Erik
Betreff: Abfrage-Generator – Eindeutige DatensätzeEric,
Ich verstehe es jetzt besser und stimme Ihnen zu. Nochmals vielen Dank für die Mühe, die Sie sich für dieses Problem gemacht haben.
Ihre Hilfe war sehr wertvoll.
Betreff: Abfrage-Generator – Eindeutige DatensätzeWenn Sie die Originalversion nur mit Time ausführen und die MAX-Aggregation aufWenn ich tue, was Sie gesagt haben, und p1 und p2 in der Abfrage belasse, erhalte ich alle Zeilen mit den doppelten Maximalzeiten, da p1 und p2 zu GROUP BY-Werten für die Abfrage werden:

Wenn ich nun p1 und p2 aus der Abfrage entnehme, gibt die Abfrage die richtigen Zeilen zurück:

aber der springende Punkt war, die Werte von p1 und p2 für diese Zeilen zu finden, und sie sind weg.Daher denke ich, dass der Ansatz mit doppelten Unterabfragen der einzige Ansatz ist, der die von Ihnen gestellte Frage beantwortet.
Erik
Betreff: Abfrage-Generator – Eindeutige DatensätzeEric,
Es funktionierte wie ein Zauber ...
Ich frage mich allerdings ... hätte es auch funktioniert, wenn man die erste Originalversion der benutzerdefinierten Epxression (nur mit Zeit) ausgeführt hätte UND gleichzeitig die X-Aggregation als „Maximum“ im Feld „Eingeschlossene Spalten“ ausgewählt hätte ...?
Vielen Dank ....
Betreff: Abfrage-Generator – Eindeutige DatensätzeDISTINCT wird dem OP nicht helfen, da es hier wirklich keine unterschiedlichen Zeilen gibt.
Ich habe eine Abfrage gefunden, die den zweiten Fall lösen würde.Ich habe unten sechs Zeilen hinzugefügt, die die Höchstzeiten für jedes Asset duplizieren, und außerdem eine X-Variable hinzugefügt.Hier ist die Tabelle:

Und hier ist die Abfrage, die funktioniert (sie erfordert eine Unterabfrage und eine Unterabfrage innerhalb einer Unterabfrage)):

Der benutzerdefinierte Ausdruck lautet:
t1.Time = (SELECT MAX(tInner.Time) FROM parts tInner WHERE t1.Asset = tInner.Asset)
UND
t1.X = (SELECT MAX(tInner.X) FROM parts tInner WHERE t1.Asset = tInner.Asset AND
tInner.Time = (SELECT MAX(tInner2.Time) FROM parts tInner2 WHERE tInner.Asset = tInner2.Asset))
Um die Lesbarkeit zu erleichtern, habe ich alle SQL-Schlüsselwörter groß geschrieben.Ich habe einige einfachere Abfragen ausprobiert, aber sie haben nicht funktioniert.
HTH,
Erik
Betreff: Abfrage-Generator – Eindeutige DatensätzeWenn es sich um einen doppelten Eintrag handelt, hilft möglicherweise die Verwendung des Schlüsselworts DISTINCT.
Betreff: Abfrage-Generator – Eindeutige DatensätzeIch habe vergessen hinzuzufügen ...
Der Grund dafür, dass ich Ihre Abfrage ursprünglich nicht zum Laufen bringen konnte, liegt darin, dass ich nicht richtig auf die Datenbank verwiesen habe. Nachdem wir das getan hatten, funktionierte es
Betreff: Abfrage-Generator – Eindeutige DatensätzeEric,
Vielen Dank ....
Tut mir leid, ich habe einige Zeit gebraucht, um es mit einem anderen Experten für Fragen bei GE herauszufinden.
Ihre Lösung (erste) hat definitiv funktioniert !!! Den zweiten habe ich noch nicht ausprobiert.
Ich habe noch ein Problem:
Es stellt sich heraus, dass Leute, die die Datenbank füllen, zum gleichen letzten chronologischen Zeitpunkt doppelte Einträge für einige Assets eingefügt haben. Um das zu umgehen, habe ich eine weitere Kolumne mit dem Titel say X . Manuell würde ich einfach die beiden mit dem größten X auswählen. Ich wollte nicht von Max(Time) nach Max(X) konvertieren, da X allein möglicherweise nicht so zuverlässig ist, aber der Auswahlfaktor für doppelte Zeiteinträge wäre.
Wir haben versucht, Ihren ursprünglichen benutzerdefinierten Ausdruck so zu konvertieren, dass er einen zweiten MAX (auf X) einschließt ... aber das hat nicht funktioniert ...
Also .. versuchen, jedes Asset abzurufen, bei dem die Zeit MAX ist, und bei mehreren Einträgen den Eintrag mit Max(X) auszuwählen.
Irgendwelche Vorschläge
Betreff: Abfrage-Generator – Eindeutige DatensätzeMein ursprüngliches Beispiel war für SQL Server, was etwas nachsichtiger ist.Für Oracle musste ich den Tabellennamen in der Unterabfrage als schema.table formatieren und außerdem meine Namen in gemischter Groß- und Kleinschreibung in Anführungszeichen setzen:
t1. „Zeit“ = (wählen Sie MAX(t2. „Zeit“) aus SQBTEST. „Teile“ t2 wobei t2.“Asset“ = t1.“Asset“)
Versuchen Sie es zu ändern mein Tisch bei deinem ersten Versuch .my_table und sehen Sie, ob das hilft.
Erik
Betreff: Abfrage-Generator – Eindeutige DatensätzeHey, Altug,
Welche Datenbank verwenden Sie?
Wären Sie bereit, die SQL aus Ihrer benutzerdefinierten SQL-Abfrage weiterzugeben, die Ihnen das gewünschte Ergebnis liefert?
Danke,
Erik
Betreff: Abfrage-Generator – Eindeutige DatensätzeHallo Eric,
Erstmal vielen Dank für eure Hilfe....
Dein Verständnis ist korrekt. Ich versuche nur, eine einzelne Zeile für jedes Asset abzurufen, bei dem die Zeit maximal (oder aktuell) ist.
Ich habe deine Formeln angewendet. Es gibt mir jedoch eine Fehlermeldung.
Ich habe es zuerst als echten Tabellennamen und dann als „t1“ angewendet.
t1.calendar_month = (wählen Sie MAX(calendar_month) aus my_table t2 aus, wobei t1.engine_serial_num = t2.engine_serial_num ist)
t1.calendar_month = (wählen Sie MAX(calendar_month) aus t1 t2 aus, wobei t1.engine_serial_num = t2.engine_serial_num)
FEHLER: Relation „my_table“ existiert nicht.
FEHLER beim Ausführen der Abfrage [ SQLSTATE: 42P01 ]
Betreff: Abfrage-Generator – Eindeutige DatensätzeHey, Altug,
Hier ist eine Tabelle, die meiner Meinung nach dem ähnelt, was Sie beschreiben (aber gehen Sie davon aus, dass sie sich in einer Datenbank und nicht in JMP befindet):

Meines Wissens nach möchten Sie eine Zeile für A1, A2, A3 und A4 abrufen, für die die Zeit das Maximum ist.Ist das korrekt?
Ich glaube nicht, dass das möglich ist, ohne eine Unterabfrage durchzuführen, die die MAX-Funktion verwendet, was Sie mit einem benutzerdefinierten Ausdrucksfilter tun können.Hier ist die Abfrage, die ich letztendlich gestellt habe:

Falls das zu klein zum Lesen ist, lautet der benutzerdefinierte Ausdruck:
t1.Time = (wählen Sie MAX(Time) aus Teilen t2, wobei t1.Asset = t2.Asset)
Sie übergeben also den Wert von Asset aus der Hauptabfrage (t1.Asset) und wählen Zeilen aus, die den maximalen Zeitwert für dieses Asset haben.
Lassen Sie mich wissen, ob das hilft.
Erik
Betreff: Abfrage-Generator – Eindeutige DatensätzeRechnung
Danke für die schnelle Antwort.
Sofern ich hier jedoch nichts Entscheidendes übersehe, löst dies mein Problem nicht.
1) Die letzten gültigen Zeitpunkte eines Vermögenswerts liegen normalerweise nicht am selben Zeitpunkt, sondern sind sehr unterschiedlich. Sie können jahrelange Unterschiede aufweisen.
2) Ich suche nach Möglichkeit keine zeitnahe Lösung. Ich brauche, dass dies vollständig automatisiert ist.
3) Ich bin mir wirklich nicht sicher, wie „Filtern nach“ mit >= es auch einzigartig machen kann. Ich denke, Sie wollten lieber nach „=" filtern
Daher benötige ich einen Ansatz, der den neuesten chronologischen Eintrag für jedes Asset erfasst, ohne dass ein Zeitfilter angegeben werden muss (da die neuesten Daten zu einem beliebigen Zeitpunkt vorliegen können).
Danke.
Betreff: Abfrage-Generator – Eindeutige DatensätzeHallo Altug,
Bitte sehen Sie sich das Bild unten an, um eine absteigende Reihenfolge für die Zeit zu erhalten.
Klicken Sie mit der rechten Maustaste auf Ihre Zeitvariable in den verfügbaren Spalten und wählen Sie „Sortieren nach“. Unten rechts wird ein neues Dialogfeld angezeigt.Von dort aus können Sie den Abwärtspfeil wählen, um die gewünschte Zeitreihenfolge zu erhalten.
Sie könnten dann einen Filter mit einer Eingabeaufforderung verwenden, um eine eindeutige Asset-Ebene auszuwählen.
