Access & SOHO-Datenbanken
Von: Αnоnүm (abgemeldet), 15.1.2004 11:57 Uhr
Hallo an Alle

Meine Situation:
In einer Tabelle wird zu jedem Datensatz das Datum und die Uhrzeit ("tt.mm.jjj hh:nn:ss") gespeichert. An einem Tag können mehrere Datensatzeinträge stattfinden.

Mein Problem:
Ich benötige nun für jeden Tag den ERSTEN und den LETZTEN Datensatz.
Wie geht denn das?

Hab zwar schon mit einer Abfrage und der Aggregatfunktion "ErsterWert" experimentiert, aber ich krieg es einfach nicht hin.

Wäre für jede Hilfe dankbar!

smi



  1. Antwort von Τоmһ 0
    Re: Ersten und letzten Datensatz eines Tages ermit
    hi!

    das select lautet (ungefähr - ich hab den format-befehl nicht ganz im kopf und weiß nicht, ob access ein "exists" überhaupt kennt):

    select *
    from tabelle t1
    where
    -- die maximalen datumswerte pro tag
    not exists (select 1 from tabelle t2 where t1.datum < t2.datum and format(t1.datum,"ttmmyyyy")=format(t2.datum,"ttmmyyyy"))
    or
    -- die minimalen datumswerte pro tag
    not exists (select 1 from tabelle t3 where t1.datum > t3.datum and format(t1.datum,"ttmmyyyy")=format(t3.datum,"ttmmyyyy"))
    -- und geordnet
    order by datum

    kennt access ein "trunc()"? wenn ja, kannst das format(...) in ein trunc(tn.datum)" umwandeln ...

    grüße,
    tomh
    3 Kommentare
    • von Αnоnүm (abgemeldet) 0
      Re^2: Ersten und letzten Datensatz eines Tages erm
      Hallo!

      Erst mal Danke für die Hilfe!

      Den Format-Befehl kriegt ich bestimmt irgendwie hin, aber beim Rest hab ich noch Probleme: 'tabelle t1', 'tabelle t2' und 'tabelle t3'?
      Welche drei Tabellen sind da gemeint?. Ich habe doch nur EINE Tabelle mit einer Datums-Spalte, wie z.B.

      id date
      1 13.01.2004 14:00:00
      2 13.01.2004 15:00:00
      3 13.01.2004 16:00:00
      4 14.01.2004 11:00:00
      5 14.01.2004 12:00:00
      6 14.01.2004 13:00:00
      7 14.01.2004 14:00:00

      Die Abfrage soll mir nun die id 1,3,4,7 liefern!

      Was bedeutet die 1 bei 'select 1 from ...'? Muß das nicht ein Tabellenname sein oder sowas wie 'var = funktion(...)'


      Kann man das auch mit einer Access-Abfrage hinbekommen?


      Danke noch mal für die Hilfe!

      Gruß
      Jürgen [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
    • von Τоmһ 0
      Re^3: Ersten und letzten Datensatz eines Tages erm
      hi! Den Format-Befehl kriegt ich bestimmt irgendwie hin, aber beim
      Rest hab ich noch Probleme: 'tabelle t1', 'tabelle t2' und
      'tabelle t3'?
      das t1, t2 und t3 sind tabellen-aliases, "tabelle" ist immer deine tabelle; die aliases sind dazu da, das tabellen, die mit sich selber verknüpft sind bzw. gleiche feldnamen enthalten, diese feldnamen eindeutig identifiziert werden (wie in diesem fall das feld "datum") Welche drei Tabellen sind da gemeint?. Ich habe doch nur EINE
      Tabelle mit einer Datums-Spalte, wie z.B.
      s.o. id date
      1 13.01.2004 14:00:00
      2 13.01.2004 15:00:00
      3 13.01.2004 16:00:00
      4 14.01.2004 11:00:00
      5 14.01.2004 12:00:00
      6 14.01.2004 13:00:00
      7 14.01.2004 14:00:00
      mit dem vorgeschlagenen select bekomme ich
      id date
      1 13.01.2004 14:00:00
      3 13.01.2004 16:00:00
      4 14.01.2004 11:00:00
      7 14.01.2004 14:00:00

      richtig also (allerdings setze ich das select auf einer oracle-db ab, da ich kein access hier und jetzt zur verfügung hab) Was bedeutet die 1 bei 'select 1 from ...'? Muß das nicht ein
      Tabellenname sein oder sowas wie 'var = funktion(...)'
      tabellenname schon gar nicht, sondern ein feldname oder konstante (wie bei mir "1"9; allerdings wird hier mit dem "not exists" nur nachgeschaut, ob irgend ein eintrag in der tabelle enthalten ist und das ist es gehüpft wie gesprungen, ob ich "t2.datum", "t2.id", "1" oder "'abc'" reinschreib, da ich eben keinen wert haben will, sondern nur im prinzip ein true (exists) oder false (not exists) ... Kann man das auch mit einer Access-Abfrage hinbekommen?
      das ist hier die frage, probiers mal aus ... (wie gesagt, derzeit nur oracle verfügbar) ... oder es könnte hier ein access-sql-kundigerer kommentieren, ob ein "not exists" möglich ist bzw. ob es eine alternative in access dazu gibt

      grüße,
      tomh
    • von Αnоnүm (abgemeldet) 0
      Re^4: Ersten und letzten Datensatz eines Tages erm
      Hallo

      hab's jetzt soweit verstanden und es funktioniert auch. Allerdings ist das Ergebnis nicht das gewünschte, da das Date-Feld Datum und Zeit im Format "tt.mm.jjjj hh:nn:ss" enthält. Somit erhalte ich immer den ersten und den letzen Tag des MONATS.

      Außerdem dauert die Abfrage ziemlich lange, da die Tabellen auf einem SQL-Server liegen und ich sie in Access nur per ODBC verknüpft habe. Wenn ich mich nicht irre, holte er dadurch erstmal alle Datensätze auf den Client und macht hier die Berechnung. Schätze aus Performancegründen sollte ich dann Access-Project und Stored-Procedures verwenden. Wäre ja interessant, aber ich brauche erst mal eine schnelle Lösung und bei SQL muß ich noch viel lernen ;-)

      Werde mit deinem Beispiel aber weiterüben! Danke.

      Bye
      Jürgen [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
  2. Antwort von mіb (abgemeldet) 0
    Re: Ersten und letzten Datensatz eines Tages ermit
    Hi, vieleicht hilft Dir mein Lösungsweg weiter ( einfache Abfrage ):
    splite die Spalte mit Datum und Uhrzeit in zwei Spalten. Setze dann den Standartwert auf "Date()" bei Datum und "Time()" bei der Uhrzeit. Somit wird mit jedem neuen Datensatz der aktuelleste Wert gesetzt, den Du aber auch editieren kannst. In den Abfragen, kannst Du nun nach Datum gruppieren und bei der Uhrzeit die Funktion Min und Max nutzen. Hierzu fügst Du neben dem Datumsfeld das Zeitfeld 2x ein und benennst es in zB. aTime und bTime um. Das wars. Du erhälst nun gruppiert nach Datum den niedrigsten Zeiteintrag und den höchsten.

    gr mib [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
    3 Kommentare
    • von Αnоnүm (abgemeldet) 0
      Re^2: Ersten und letzten Datensatz eines Tages erm
      Danke! Du hast mich sehr weiter gebracht.
      Da ich die Spalte in der Tabelle nicht splitten kann, habe ich eine Abfrage mit zwei 'berechneten' Felder erstellt:
      tag: Format([DatumUndZeit];"jjjj.mm.tt")
      zeit:Format([DatumUndZeit];"hh:nn:ss")
      Wenn ich diese Abfrage nach 'tag' gruppiere und die MIN-Aggregatfunktion für 'zeit' wähle funktioniert alles. Wenn ich aber in die Abfrage weitere Spalten aus meiner Tabelle aufnehme, z.B. die ID-Spalte (AutoWert), zeigte er mir wieder alle Datensätze an, weil er die ID-Spalte auch gruppieren will :-(
      Ich will aber bei ID nix gruppieren oder berechnen ...
      Wenn ich das Feld Funktion in der Spalte ID lösche, bringt er die Fehlermeldung, "...das die Abfrage den Ausdruck 'id' nicht als Teil der Aggregatfunktion einschliesst"

      Hast du vielleicht noch eine Tipp für mich?
      Wär' super, danke!

      Jürgen [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
    • von mіb (abgemeldet) 0
      Re^3: Ersten und letzten Datensatz eines Tages erm
      Hallo Jürgen,
      tja, jetzt wird es etwas komplizierter. Da du mit der geforderten ID 2 unterschiedliche Zeilenwerte einer Zeile zuordnen möchtest, musst Du Access ein Schnippchen schlagen. Access kann das von Hause aus nämlich nicht. Aber nichts desto trotz, es geht.
      Also ich versuchs mal zu beschreiben. Als erstes hast Du Deine "Abfrage1" mit der Du die Min-/Max-Zeiten anzeigen lässt. Darauf setzt Du nun eine "Abfrage2" in der Du die Basistabelle ( also die mit Deiner ID ) über das Datum verknüpfst. Füge alle Felder aus Abfrage1 hinzu und kreiere aus dem ID Feld der verknüpften Tabelle zwei neue Spalten ( ID1 + ID2 ).Der Feldeintrag für ID1 sollte lauten:
      ID1: Wenn([aTime]=[Zeit];[ID];"x") - Der Feldeintrag für ID2:
      ID2: Wenn([bTime]=[Zeit];[ID];"x").
      Diese Abfrage speicherst Du nun ab und öffnest eine 3.Abfrage in der Du alle Felder aus Abfrage2 einfügst und unter Kriterien bei ID1 ein "<>x" einträgst. Den selben Eintrag nimmst Du nun unter Kriterien bei ID2 vor, allerdings eine Zeile tiefer unter Kriterien "oder".
      Damit hast Du nun jeden Eintrag zu jedem Datum und den entsprechenden ID zu der jeweiligen Zeit.
      Solltest Du mit der Beschreibung nicht klarkommen schicke ich Dir gerne eine Beispiel.mdb.
      Hoffe das Ergebnis kommt Deinen Vorstellungen nahe.
      gr mib [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
    • von Αnоnүm (abgemeldet) 0
      Re^4: Ersten und letzten Datensatz eines Tages erm
      Hallo mib

      also wenn es dir nichts ausmacht, wäre eine Beispiel.mdb super. Ich check das nicht so wirklich, obwohl ich jeden Tag schon rum experimentiert habe :-(

      Vielen Dank!
      Jürgen Hallo Jürgen,
      tja, jetzt wird es etwas komplizierter. Da du mit der
      geforderten ID 2 unterschiedliche Zeilenwerte einer Zeile
      zuordnen möchtest, musst Du Access ein Schnippchen schlagen.
      Access kann das von Hause aus nämlich nicht. Aber nichts desto
      trotz, es geht.
      Also ich versuchs mal zu beschreiben. Als erstes hast Du Deine
      "Abfrage1" mit der Du die Min-/Max-Zeiten anzeigen lässt.
      Darauf setzt Du nun eine "Abfrage2" in der Du die Basistabelle
      ( also die mit Deiner ID ) über das Datum verknüpfst. Füge
      alle Felder aus Abfrage1 hinzu und kreiere aus dem ID Feld der
      verknüpften Tabelle zwei neue Spalten ( ID1 + ID2 ).Der
      Feldeintrag für ID1 sollte lauten:
      ID1: Wenn([aTime]=[Zeit];[ID];"x") - Der Feldeintrag für ID2:
      ID2: Wenn([bTime]=[Zeit];[ID];"x").
      Diese Abfrage speicherst Du nun ab und öffnest eine 3.Abfrage
      in der Du alle Felder aus Abfrage2 einfügst und unter
      Kriterien bei ID1 ein "<>x" einträgst. Den selben
      Eintrag nimmst Du nun unter Kriterien bei ID2 vor, allerdings
      eine Zeile tiefer unter Kriterien "oder".
      Damit hast Du nun jeden Eintrag zu jedem Datum und den
      entsprechenden ID zu der jeweiligen Zeit.
      Solltest Du mit der Beschreibung nicht klarkommen schicke ich
      Dir gerne eine Beispiel.mdb.
      Hoffe das Ergebnis kommt Deinen Vorstellungen nahe.
      gr mib





      Danke! Du hast mich sehr weiter gebracht.
      Da ich die Spalte in der Tabelle nicht splitten kann, habe ich
      eine Abfrage mit zwei 'berechneten' Felder erstellt:
      tag: Format([DatumUndZeit];"jjjj.mm.tt")
      zeit:Format([DatumUndZeit];"hh:nn:ss")
      Wenn ich diese Abfrage nach 'tag' gruppiere und die
      MIN-Aggregatfunktion für 'zeit' wähle funktioniert alles. Wenn
      ich aber in die Abfrage weitere Spalten aus meiner Tabelle
      aufnehme, z.B. die ID-Spalte (AutoWert), zeigte er mir wieder
      alle Datensätze an, weil er die ID-Spalte auch gruppieren will -(
      Ich will aber bei ID nix gruppieren oder berechnen ...
      Wenn ich das Feld Funktion in der Spalte ID lösche, bringt er
      die Fehlermeldung, "...das die Abfrage den Ausdruck 'id' nicht
      als Teil der Aggregatfunktion einschliesst"

      Hast du vielleicht noch eine Tipp für mich?
      Wär' super, danke!

      Jürgen



      Hi, vieleicht hilft Dir mein Lösungsweg weiter ( einfache
      Abfrage ):
      splite die Spalte mit Datum und Uhrzeit in zwei Spalten. Setze
      dann den Standartwert auf "Date()" bei Datum und "Time()" bei
      der Uhrzeit. Somit wird mit jedem neuen Datensatz der
      aktuelleste Wert gesetzt, den Du aber auch editieren kannst.
      In den Abfragen, kannst Du nun nach Datum gruppieren und bei
      der Uhrzeit die Funktion Min und Max nutzen. Hierzu fügst Du
      neben dem Datumsfeld das Zeitfeld 2x ein und benennst es in
      zB. aTime und bTime um. Das wars. Du erhälst nun gruppiert
      nach Datum den niedrigsten Zeiteintrag und den höchsten.

      gr mib Hallo an Alle

      Meine Situation:
      In einer Tabelle wird zu jedem Datensatz das Datum und die
      Uhrzeit ("tt.mm.jjj hh:nn:ss") gespeichert. An einem Tag
      können mehrere Datensatzeinträge stattfinden.

      Mein Problem:
      Ich benötige nun für jeden Tag den ERSTEN und den LETZTEN
      Datensatz.
      Wie geht denn das?

      Hab zwar schon mit einer Abfrage und der Aggregatfunktion
      "ErsterWert" experimentiert, aber ich krieg es einfach nicht
      hin.

      Wäre für jede Hilfe dankbar!

      smi
  3. Antwort von Κrіѕtіаn (abgemeldet) 0
    Re: Ersten und letzten Datensatz eines Tages ermit
    Hallo Hallo,

    mit Deiner Abfrage und der Verwendung der Funktion "Erster Wert" warst Du schon auf dem richtigen Weg! Versuch es mal mit den Funktionen "min" bzw. "max"! Das sollte funktionieren.
    Gruß und schönes Wochenende...
    Kristian [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]