Patrick.Karre Geschrieben 19. August 2005 Teilen Geschrieben 19. August 2005 Hallo Forum, ich habe eine Tabelle mit vielen Adressen. Jede Adresse hat ein Erstellungsdatum. Ich möchte das die Adresse mit dem jüngsten Erstellunsgdatum und Zeit einen Wert gesetzt bekommt. Ich bekomme es nicht hin. Kann mit jemand helfen? LG Patrick Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
robotto7831a Geschrieben 19. August 2005 Teilen Geschrieben 19. August 2005 Welche Datenbank? Wie sieht dein Ansatz aus? Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tuxfriend Geschrieben 20. August 2005 Teilen Geschrieben 20. August 2005 Hallo, es wäre interessant, das RDBMS zu kennen, aber die Funktion MAX gibt bei vielen in einem select statement den Maximalwert der gewählten Spalte zurück. Für Datumsfelder ist das das aktuellste Datum select MAX(Creationdate) from Addresstable Jetzt baust du dieses select noch in dein update statement ein: update Addresstable set AField=SomeValue where Creationdate = select MAX(Creationdate) from Addresstable Wenn mehere Datensätz mit gleichem Datum in der Tabelle stehen und dieses Datum der Maximalwert ist, werden alle aktualisiert. Gruß Nils Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Patrick.Karre Geschrieben 22. August 2005 Autor Teilen Geschrieben 22. August 2005 Hallo zusammen, habe mich leider in ein paar Punkten nicht deutlich ausgedrückt. Das ganze ist in einer MS-SQL Datenbank. Alle Adressen befinden sich in einer Tabelle. Eine Adresse kann mehrmals in einer Tabelle vorkommen. Die Tabelle liefert Daten aus einem anderem System (daher mehrfach vorkommende Adressen). Damit die Adressen aber nur einmal in die neue Datenbank kommen, soll einfach die Adresse mit dem jüngsten oder ältesten Datum eine Markierung bekommen. Ich habe es schon mit UPDATE tblWORK SET FlagNew = 1 WHERE CreationDate=(SELECT MIN(CreateDate) FROM tblWork) Komme leider nicht zum gewünschten Ergebnis. Jede Adresse beinhaltet auch eine Uhrzeit. Nur wenn ich nach dieser eine Auswertung mache mit einem weiteren SELECT bekomme ich keine Adressen zurück geliefert. Gruß aus Hanau Patrick Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 22. August 2005 Teilen Geschrieben 22. August 2005 Also ich verstehe das jetzt so: Eine Adresse kann mehrmals in der Tabelle vorhanden sein. Für jede (unterschiedliche) Adresse soll jetzt der Datensatz, der als letztes angelegt wurde, gekennzeichnet werden. SELECT Vorname, Nachname, Min(CreateDate) Datum FROM Tabelle Group By Vorname, Nachname Das sollte dir den neuesten Satz zu jeder Adresse liefern. Vorrausgesetzt Die Namen sind überall gleich und kein Tipfehler oder so drin. Vielleicht nocht Strasse oder irgendwas eindeutiges dazu (weil Hans Müller kann ja durchaus zu mehr als einer Person gehören). Das sollte reichen um es dann wie in deinem SQL als Subselect in das Update-SQL eingebaut wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Patrick.Karre Geschrieben 22. August 2005 Autor Teilen Geschrieben 22. August 2005 Hallo Jesterday, stimmt genau Mein Updatestatement sieht mittlerweile wie folgt aus: UPDATE [tblWORK] SET FlagNew=1 FROM (SELECT UID, MIN(PACS_LastAccessDate) as dat, MIN(PACS_LastAccessTime) as tim FROM tblWork GROUP BY UID) AS t1 WHERE tblWORK.UID NOT IN (SELECT UID FROM tblAS0014) AND tblWORK.UID=t1.UID Leider wird der FLAGNEW immer noch überall auf den Wert 1 gesetzt. Was ist falsch? Gruß aus Hanau Patrick Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 22. August 2005 Teilen Geschrieben 22. August 2005 Leider wird der FLAGNEW immer noch überall auf den Wert 1 gesetzt. Was ist falsch? Deine Syntax Update ... From ... Where kenne ich so nicht. Ist das vielleicht MS-SQL? Naja, also ich würde das so machen: update Table SET Field WHERE uid in (SELECT blablabla) Allerdings wird das mit uid nciht gehen, weil dann der "group by" nicht funktioniert. Hatte mir das bei meinem ersten Beitrag schon so überlegt. Du musst halt etwas nehmen, was in allen Datensätzen (die die gleiche Adresse haben) gleich und was auch für diese Adresse eindeutig ist. Oder du bastelst das ganze in ein Sub-Sub-Select ... nein, auch da kommst du aber um eine eindeutige Gemeinsamkeit nicht rum: select uid from (select uid, CreateDate from Tabelle where Name='Maier' and Vorname='Hans') order by CreateDate desc limit 1 Damit solltest du eigentlich nur die neueste id für Hans Maier bekommen. Du könntest natürlich anstelle der Namen noch ein SELECT DISTINCT concat(Name, ' ' , Vorname) Name FROM Tabelle mit einbauen um nicht alle Namen eingeben zu müssen... Eine Eindeutige UserID wäre da ganz praktisch, kenne deine Tabellen aber nicht. (Aber wenn es die geben würde, dann bräuchte (dürfte auch gar nicht) es ja keine mehreren Sätze pro User (Adresse) geben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Joe Kinley Geschrieben 22. August 2005 Teilen Geschrieben 22. August 2005 Wie waers mit dem Snippet zum Juengsten: SELECT TOP 1 id FROM tabelle WHERE was auch immer ORDER BY date_field DESC Hoffe das hilft ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 22. August 2005 Teilen Geschrieben 22. August 2005 Hoffe das hilft ? Das liefert aber nur die neueste Adresse zurück. Es gibt ja aber mehrere Adressen, die auch jeweils mehrfach vorhanden sind. Und von jeder einzelnen Adresse soll nur der neueste Satz kommen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Patrick.Karre Geschrieben 22. August 2005 Autor Teilen Geschrieben 22. August 2005 Hallo Leute, also... der Ansatz von JesterDay war Perfekt. Folgendes Statement ist die endgültige Lösung: UPDATE [tblWORK] SET FlagNew=1 FROM tblWORK AS T1 WHERE UID NOT IN (SELECT UID FROM tblAS0014) AND PACS_LastAccessDate=(SELECT MIN(PACS_LastAccessDate) FROM tblWORK WHERE T1.UID=tblWORK.UID) AND PACS_LastAccessTime=(SELECT MIN(PACS_LastAccessTime) FROM tblWORK WHERE T1.UID=tblWORK.UID) Danke an alle. Gruß aus Hanau Patrick Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.