Ergebnis 1 bis 3 von 3

PL/SQL - Datumsvergleich

  1. #1 Zitieren
    Ehrengarde Avatar von Time2Die
    Registriert seit
    Jul 2007
    Ort
    Bei dir
    Beiträge
    2.566
    Hallo Leute!

    Ich muss aus einer Tabelle mittels Pl/SQL-Statements einen Wert zu einem Attribut auslesen.
    Das Attribut hat ab gewissen Stichtagen unterschiedliche Werte, das ist die Tabelle:

    Code:
    [Spalte attr]       [Spalte dateofvalue]   [spalte price]
     homeAddress 	01.07.14	                 5
     homeAddress 	01.01.15	                 7
     mobilePhone 	01.01.14	                 5
     mobilePhone 	01.11.14	                 2
     maritalStatus 	01.11.13	                 1
    age 	                01.01.14	                 2
    age 	                01.06.14	                 1
     hobbies 	        01.01.14	                 0,5
     musicTaste 	01.07.14	                 0,1
     electronics 	01.01.14	                 0,5
     electronics 	01.07.14	                 0,25
     socialContacts 	01.01.14	                 1
     socialContacts 	01.01.15	                 1,75
    Aber so weit bin ich nicht, dass ich den Wert im bezug auf das aktuelle Datum auslese.

    Ich habe nur mal testweise probiert, den spätesten Zeitpunkt auszulesen:

    Code:
    SELECT DISTINCT attr, dateofvalue, price FROM Informationvalues
    WHERE attr IN (SELECT  attr, MAX(DATEOFVALUE) FROM Informationvalues GROUP BY attr)
    GROUP BY attr, dateofvalue, price;
    Dazu schreibt Oracle SQL Developer:

    ORA-00913: Zu viele Werte
    00913. 00000 - "too many values"
    *Cause:
    *Action:
    Fehler in Zeile: 2 Spalte: 16
    Wenn ich das hingegen ausführe
    Code:
    SELECT DISTINCT attr, dateofvalue, price FROM Informationvalues
    WHERE dateofvalue IN (SELECT  MAX(DATEOFVALUE) FROM Informationvalues GROUP BY attr)
    GROUP BY attr, dateofvalue, price;
    kommen wieder alle Attribute zu jedem Zeitpunkt.

    Was mache ich falsch?
    Ärger mit Hard- oder Software? Oder willst dir welche zulegen?
    Ab ins PC- und Multimediaforum! (und nicht in die PE )
    Gothic-3-Spielstand gefällig?

    Time2Die ist offline

  2. #2 Zitieren

    Batmanistrator
    Avatar von Thoronador
    Registriert seit
    Jul 2005
    Ort
    Morrowind, Vvardenfell-Distrikt
    Beiträge
    20.427
    Du solltest dir zunächst klarmachen, was die von dir geschriebene Abfrage überhaupt macht. Dann wird dir auch schneller klar, wo der Fehler liegt.
    Also:

    Code:
    SELECT DISTINCT attr, dateofvalue, price FROM Informationvalues
    WHERE attr IN (SELECT  attr, MAX(DATEOFVALUE) FROM Informationvalues GROUP BY attr)
    GROUP BY attr, dateofvalue, price;
    Der rot markierte Teil ist ein Sub-SELECT und dort liegt auch der Fehler. Die Abfrage
    Code:
    SELECT  attr, MAX(DATEOFVALUE) FROM Informationvalues GROUP BY attr
    allein liefert dir was? Nein, nicht die Zeile mit dem höchsten Wert in der Spalte dateofvalue, sondern den Wert der Spalte attr und dazu den Maximalwert von dateofvalue, und das für jeden einzigartigen Wert von attr. Du hast damit also potentiell mehrere Zeilen, die aus jeweils zwei Spalten bestehen.

    Und jetzt binden wir das in die komplette Abfrage ein. Der Abschnitt ... WHERE attr in (Sub-SELECT) kann noch mit mehreren Zeilen umgehen, der IN-Operator funktioniert ja normalerweise auch mit einer Menge. Allerdings besteht diese Menge jeweils aus Elementen mit zwei Werten ("Paare"), doch wie will man ein Paar mit dem Einzelwert attr vergleichen können? Eben, das geht nicht, und deswegen kommt auch die Meldung, dass es zu viele Werte sind. Man muss die Sub-SELECT-Anfrage also so modifizieren, dass sie nur noch einspaltige Ergebnisse liefert. Das kombiniert man dann noch mit einer entsprechenden Bedingung (z.B. WHERE-Klausel), so dass man nur den attr-Wert aus der Zeile mit dem Maximalwert von dateofvalue bekommt, dann hat man das Ergebnis zum spätesten Zeitpunkt.

    Wenn ich mich nicht irre, könnte die Abfrage mit dem spätesten Zeitpunkt dann so aussehen:
    Spoiler:(zum lesen bitte Text markieren)
    Code:
    SELECT DISTINCT attr, dateofvalue, price FROM Informationvalues
    WHERE attr IN (SELECT  attr FROM Informationvalues WHERE dateofvalue=MAX(DATEOFVALUE) LIMIT 1)
    GROUP BY attr, dateofvalue, price;

    Ist ungetestet, und mit Oracle Database Server habe ich bisher noch nicht gearbeitet, aber nach dem obigen Prinzip würde man es in MySQL lösen.
    Thoronador ist offline

  3. #3 Zitieren
    Drachentöter Avatar von Vertaler
    Registriert seit
    Sep 2006
    Beiträge
    4.539
    Zitat Zitat von Thoronador Beitrag anzeigen
    Wenn ich mich nicht irre, könnte die Abfrage mit dem spätesten Zeitpunkt dann so aussehen:
    Code:
    SELECT DISTINCT attr, dateofvalue, price FROM Informationvalues
    WHERE attr IN (SELECT  attr FROM Informationvalues WHERE dateofvalue=MAX(DATEOFVALUE) LIMIT 1)
    GROUP BY attr, dateofvalue, price;
    Ist ungetestet, und mit Oracle Database Server habe ich bisher noch nicht gearbeitet, aber nach dem obigen Prinzip würde man es in MySQL lösen.
    Warum LIMIT 1? Wenn es mehrere attr gibt, die das "maximale" Datum haben, sollten doch auch alle zurückgegeben werden. Allerdings liefert das natürlich nur die "attr" mit dem absoluten Maximum für dateofvalue zurück – ich glaube nicht, daß es das ist, was er möchte.

    Ich schätze, daß das eigentliche Ziel der Abfrage ein ganz anderes ist: er möchte für jedes "attr" den "price"-Wert mit dem maximalen "dateofvalue" für dieses "attr" haben. Dafür die die zweite Abfrage aus dem Eingangsbeitrag fast geeignet, es fehlt in der Unterabfrage nur die Bedingung, daß es der Maximalwert für den gerade betrachtete "attr"-Wert sein soll.

    Ich hab mal die überflüssigen DISTINCT und GROUP BY weggelassen und der Tabelle in der Hauptabfrage einen Alias gegeben, damit die Unterabfrage verständlicher ist. Ungetestet, aber so sollte es eigentlich klappen für das von mir beschriebene Szenario:
    Code:
    SELECT attr, dateofvalue, price
    FROM Informationvalues AS i
    WHERE dateofvalue = (SELECT MAX(dateofvalue) FROM Informationvalues WHERE attr = i.attr);
    Es entsteht immer wieder Anlass zu vorsichtiger Lebensfreude, wenn man sich vor Augen hält, was es alles nicht gibt und was es daher vielleicht auch niemals geben wird.

    [Bild: rand.php?p=xkcd&n=3] [Bild: rand.php?p=numminen&n=3] [Bild: rand.php?p=co&n=4] [Bild: rand.php?p=snark&n=3] [Bild: rand.php?p=musik&n=5]
    Vertaler ist offline Geändert von Vertaler (04.04.2015 um 08:48 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •