Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

  • Autor

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

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.

  • Autor

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

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.

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 ?

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.

  • Autor

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.