Zum Inhalt springen

Update auf das jüngste Datum


Patrick.Karre

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...