Ersten und letzten Datensatz eines Tages ermitteln

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

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 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

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]

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]

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

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 :frowning:
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]

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]

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 :wink:

Werde mit deinem Beispiel aber weiterüben! Danke.

Bye
Jürgen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

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]

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 :frowning:

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