Seite 1 von 1
Abfragen mit Base letztes Datum anzeigen
Verfasst: Sa, 09.02.2013 20:24
von violet_Raptor
Hallo,
habe mich gerade neu hier angemeldet.
Was ich haben möchte:
Ich möchte mir mit Base eine Datenbank "EVE Online Wormhole-Database" erstellen. Dazu habe ich momentan zwei Tabellen erstellt. Eine Tabelle "Wormhole" mit der Spalte "Wormhole-ID" (CHAR) als Primärschlüssel und weiteren Spalten z.B. Art. Im Prinzip könnte diese Tabelle schon reichen, leider gibt es Wurmlöcher die instabil sind und "springen" daher ist der Ort, das System, nicht statisch. Des weiteren möchte ich auch dokumentieren wie sich die Position des Wurmloches verändert, um später ggf. Prognosen zu erstellen. Daher habe ich die zweite Tabelle "Datalog" mit der Spalte "Sternzeit" (TIMESTAMP) als Primärschlüssel erstellt. Daneben gibt es die Spalte "Wurmloch" (CHAR), "System" (CHAR), "Verbunden" (CHAR) und "Test" (INTEGER). So weit so gut.
Mit einer Abfrage möchte ich nun die aktuellen Daten erhalten d.h. ich möchte nur sehen wo ein Wurmloch zuletzt war, zuletzt hingeführt hat usw.
Mein Problem:
Ich hab hier zwar ein SQL für Dummies liegen aber Base lacht mich nur aus. Anscheinend ist der Syntax nicht zu 100% kompatibel oder ich mache einfach nur was falsch. Deshalb habe ich eine nach langen hin und her eine Spalte "Test" erstellt und möchte mir nun mit der Funktion MAX den Maximalwert ausgeben lassen, dass klappt aber nicht.
Das habe ich momentan stehen:
Code: Alles auswählen
SELECT "Wormhole"."Wormhole-ID", "Datalog"."Sternzeit", MAX( "Datalog"."Test" ) FROM "Wormhole", "Datalog" WHERE "Wormhole"."Wormhole-ID" = "Datalog"."Wormhole"
Was mache ich falsch?
Später werde ich die Spalte "Test" entfernen und möchte eine Art Max(Sternzeit) machen, wobei mir klar ist das MAX sich nicht auf TIMESTAMP anwenden lässt. Meine Idee war hier so eine Art Intervall zwischen Eintrag und momentaner Zeit (CURRENT_TIMESTAMP) zu berechnen (vlt. in Minuten). Wenn man das dann nach einen Minimalwert absucht sollte man den aktuellsten Eintrag zu einen Wurmloch erhalten. Das bekomme ich aber überhaupt nicht hin.
Re: Abfragen mit Base letztes Datum anzeigen
Verfasst: Sa, 09.02.2013 21:34
von RobertG
Hallo violet_raptor,
Code: Alles auswählen
SELECT "Wormhole"."Wormhole-ID", "Datalog"."Sternzeit", MAX( "Datalog"."Test" ) FROM "Wormhole", "Datalog" WHERE "Wormhole"."Wormhole-ID" = "Datalog"."Wormhole"
Kann deshalb nicht funktionieren, weil eine Funktion wie MAX nur zusammen mit Gruppierungen (GROUP BY) machbar ist.
ermittelt Dir den Maximalwert der gesamten Tabelle.
Code: Alles auswählen
SELECT "Wormhole"."Wormhole-ID", "Datalog"."Sternzeit", "Datalog"."Test" FROM "Wormhole", "Datalog" WHERE "Wormhole"."Wormhole-ID" = "Datalog"."Wormhole" AND "Datalog"."Test" = (SELECT MAX( "Datalog"."Test" ) FROM "Datalog")
sorgt dafür, dass nur der Wert mit dem Maximum angezeigt wurde.
Vielleicht helfen Dir diese Ansätze ja etwas weiter.
Gruß
Robert
Re: Abfragen mit Base letztes Datum anzeigen
Verfasst: Sa, 09.02.2013 21:44
von violet_Raptor
Danke RobertG,
jetzt weiß ich schon mal Grob was nicht geklappt hat. Leider bekomme, ich wie du schon meintest, nur den Maximalwert der ganzen Tabelle d.h. nur einen Datensatz raus. Zumindest weiß ich jetzt in welche Richtung ich mich jetzt belesen kann.
Das Problem wie ich ein Datum in eine Zahl bekomme ist aber immer noch ungelöst.
Re: Abfragen mit Base letztes Datum anzeigen
Verfasst: So, 10.02.2013 09:15
von RobertG
Hallo violet_Raptor,
violet_Raptor hat geschrieben:
Später werde ich die Spalte "Test" entfernen und möchte eine Art Max(Sternzeit) machen, wobei mir klar ist das MAX sich nicht auf TIMESTAMP anwenden lässt.
Warum sollte das nicht möglich sein? Ich kann im Abfrageentwurf ganz normal bei einem Datums-und Zeitfeld das Maximum auslesen. Ein Timestamp gibt doch nur die Sekunden an, die ab dem 1.1.1970, 0.00 Uhr vergangen sind. Dahinter steckt also auch eine Zahleneingabe, die sich natürlich ordnen lässt und bei der auch das Maximum auslesbar ist.
Versuche einfach einmal den folgenden Code:
Code: Alles auswählen
SELECT "a"."Wormhole-ID", (SELECT MAX( "Datalog"."Sternzeit" ) FROM "Datalog" WHERE "a"."Wormhole-ID" = "Datalog"."Wormhole") AS "Sternzeit_aktuell" FROM "Wormhole" AS "a"
Es handelt sich dabei um eine korrelative Unterabfrage, die zu jedem Datensatz von "Wormhole-ID" das Maximum aus der Sternenzeit ermittelt.
Gruß
Robert
Re: Abfragen mit Base letztes Datum anzeigen
Verfasst: So, 10.02.2013 15:19
von violet_Raptor
Ah danke,
das funktioniert schon ganz gut, leider steht nun in den Zeilen nichts mehr. Ich habe aber leider keine Ahnung was der Code bedeutet, bin da noch beim lesen.
Aber schrauben wir mal kurz ein Stück zurück. Besser als wie mir das letzte Datum anzuzeigen, wäre doch das mir die Abfrage sagt wie viel Zeit vergangen ist (damit ich nicht rechnen brauch). Das müsste doch einfach gehen in dem ich das heutige Datum CURRENT_TIMESTAMP oder NOW() vom eingetragenen Datum abziehe:
Code: Alles auswählen
SELECT "Wormhole"."Wormhole-ID", (CURRENT_TIMESTAMP - "Datalog"."Sternzeit")DAY FROM "Wormhole", "Datalog" WHERE "Wormhole"."Wormhole-ID" = "Datalog"."Wormhole"
Ich bekomme immer die Meldung Syntax-Fehler, nur was schreib ich falsch?
Re: Abfragen mit Base letztes Datum anzeigen
Verfasst: So, 10.02.2013 15:42
von RobertG
Hallo violet_Raptor,
Du hast die Funktion DAY() falsch angewandt. Bei Dir steht DAY hinter einem angeblichen Datum.
Bevor Du mit einem allgemeinen Buch rumschwimmst versuche doch einfach das zu nehmen, was direkt auf die HSQLDB von Base gemünzt ist:
http://de.libreoffice.org/hilfe-kontakt/handbuecher/ - dort ein bisschen nach unten scrollen. Funktionen findest Du im Anhang, Abfragen sind ein Kapitel für sich.
Gruß
Robert
Re: Abfragen mit Base letztes Datum anzeigen
Verfasst: So, 10.02.2013 19:06
von violet_Raptor
Super dein Link hat mir weiter geholfen!
Mit
Code: Alles auswählen
SELECT "Datalog"."Wormhole", MIN( DATEDIFF('dd', "Datalog"."Sternzeit", CURRENT_TIMESTAMP) ) AS "Tage seit Scan" FROM "Datalog" GROUP BY "Datalog"."Wormhole"
habe ich es geschafft mir anzeigen zu lasen wie viele Tage der letzte Scan für ein Wurmloch her ist. Wenn ich jetzt aber noch die anderen Spalten (Attribute) dazu haben möchte muss ich die auch bei GROUP BY hinschreiben, was mir mein gewünschtes Konstrukt zerstört gibt es da eine Lösung?
Re: Abfragen mit Base letztes Datum anzeigen
Verfasst: So, 10.02.2013 21:38
von RobertG
Hallo violet_Raptor,
da verweise ich doch stumpf auf den vorherigen Beitrag mit der korrelativen Unterabfrage. Ist auch in dem Handbuch erklärt. Da bedarf es schließlich keiner Gruppierung um die Differenz heraus zu holen - lediglich eines Bezuges zu dem jeweils aktuellen Datensatz.
Gruß
Robert
Re: Abfragen mit Base letztes Datum anzeigen
Verfasst: So, 10.02.2013 21:53
von violet_Raptor
So ich habe es hin bekommen! Mit folgenden Code klappt es
Code: Alles auswählen
SELECT "Wormhole"."Wormhole-ID", "b"."Ort", DATEDIFF( 'dd', "b"."Sternzeit", CURRENT_TIMESTAMP ) AS "Zeit sein Scan [Tage]" FROM "Wormhole", ( SELECT * FROM "Datalog" JOIN ( SELECT "Datalog"."Wormhole" AS "hole", MAX( "Datalog"."Sternzeit" ) AS "SZeit" FROM "Datalog" GROUP BY "Datalog"."Wormhole" ) AS "a" ON "Datalog"."Sternzeit" = "a"."SZeit" ) AS "b" WHERE "Wormhole"."Wormhole-ID" = "b"."Wormhole"
Ich werde mal zur späteren Verständlichkeit aufdrösseln was ich gemacht habe:
1. Aktuelle Wurmlöcher suchen mit
Code: Alles auswählen
SELECT "Datalog"."Wormhole" AS "hole", MAX( "Datalog"."Sternzeit" ) AS "SZeit" FROM "Datalog" GROUP BY "Datalog"."Wormhole"
Damit erhält man eine logische (virtuelle) Tabelle mit den Spalten "hole" und "SZeit" mit den aktuellsten Datensatz eines Wurmloches. Man muss die Namen ändern, da es sonst im letzten Schritt zu Fehlern kommt.
2. Wir möchten ja nicht nur den Namen und das Datum eines Wurmloches haben, sondern auch alle Daten aus der Tabelle "Datalog". Dies bekommen wir mit
Code: Alles auswählen
SELECT * FROM "Datalog" JOIN ( SELECT "Datalog"."Wormhole" AS "hole", MAX( "Datalog"."Sternzeit" ) AS "SZeit" FROM "Datalog" GROUP BY "Datalog"."Wormhole" ) AS "a" ON "Datalog"."Sternzeit" = "a"."SZeit"
oder zum bessern durch blick
Code: Alles auswählen
SELECT * FROM "Datalog" JOIN (1. Schritt) AS "a" ON "Datalog"."Sternzeit" = "a"."SZeit"
Wir erhalten eine logische Tabelle, die aus Datensätzen besteht welche die gleiche Sternzeit (Primärschlüssel, eindeutig) haben. Durch die bequeme Verwendung von * bekommen wir jetzt den Namen sowie die Sternzeit doppelt, daher die Namensänderung bei Schritt 1.
Zum Schluss erhalten wir obiges Konstrukt oder kurz
Code: Alles auswählen
SELECT "Wormhole"."Wormhole-ID", "b"."Ort", DATEDIFF( 'dd', "b"."Sternzeit", CURRENT_TIMESTAMP ) AS "Zeit sein Scan [Tage]" FROM "Wormhole", (2. Schritt) AS "b" WHERE "Wormhole"."Wormhole-ID" = "b"."Wormhole"
bzw. allgemein
Code: Alles auswählen
SELECT "Spalte" FROM "Tabelle", (2. Schritt) AS "b" WHERE "Tabelle"."Wormhole-ID" = "b"."Wormhole"