myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   MS Access Datenbank bereinigen (https://mygully.com/showthread.php?t=4600596)

ulmilten 08.10.16 15:18

MS Access Datenbank bereinigen
 
Hallo,
ich habe folgende Frage. Ich hab eine große Datenbank, dort sind ganz viele verschiedene ISINs gespeichert. Zu den ISINS werden werden noch Werte gespeichert, mehrmals am Tag. Nun möchte ich eine Abfrage erstellen, dass er mir für jeden Tag, wo die ISIN gespeichert wurde, nur noch den letzten Datensatz zur Verfügung stellt, der Rest soll endgültig GELÖSCHT werden.

So sieht sie exemplarisch für eine ISIN aus. Man muss also irgendwie aus dem TimeStamp erst den Tag ziehen, dann für jeden Tag alles bis auf die letzte Zeit löschen und das für jede ISIN.

Wie sieht die DELETE Anweisung aus? Schon mal vielen Dank.


eitch100 08.10.16 18:02

Zitat:

Zitat von ulmilten (Beitrag 29090304)
Man muss also irgendwie aus dem TimeStamp erst den Tag ziehen, dann für jeden Tag alles bis auf die letzte Zeit löschen und das für jede ISIN.

Access ist zwar auch nicht meine Baustelle, aber ich kann dir sagen, dass Access (genau wie Excel) Datum und Uhrzeit als Gleitkommazahl speichert. Also ist der höchste gespeicherte Wert automatisch der letzte Eintrag bzw. das letzte Datum. Vielleicht hilft dir das wenigstens etwas.

Möglicherweise kann man die Spalten absteigend sortieren und alle rechts der ersten löschen. So oder so ähnlich würde ich es in Excel machen. Der Dateityp der TimeStamp-Spalte dürfte natürlich nicht als Text formatiert sein. Aber wie gesagt, Access ist nicht Excel...

Edit: Sorry, hatte dein Bild falsch gelesen, also wenn es überhaupt geht, müsste man natürlich nach Zeilen sortieren...
Müsste eigentlich irgendwie in folgender Art sein:
DELETE FROM (hier kenne ich mich nicht aus :( ) < MAX(TimeStamp)

ulmilten 08.10.16 20:14

Also die TimestampZeile ist schon als Datum und Zeitfeld so eingespeichert, Access weiß genau, was drin steht. Nur ich muss ihm halt sagen, dass er immer nur für jeden Tag alles außer Max löschen sollen und halt dann zum nächsten Tag beim selben Wertpapier weitergeht...

eitch100 09.10.16 10:09

Aber mit:
DELETE FROM DeinTabellenname WHERE TimeStamp < MAX(TimeStamp)
sollte doch zumindest für die genannte Tabelle funktionieren, oder?
Mit SELECT anstatt DELETE FROM kann man sich die zu löschenden Zeilen erst mal anzeigen lassen.

Aber ich lasse es lieber, bevor ich noch mehr dummes Zeug erzähle.:D
Wie gesagt, ist nicht nicht meine Baustelle, sorry...

ulmilten 09.10.16 11:22

Naja, besser einer, als keiner^^ Sonst hat ja auch keiner Lust sich der Sache anzunehmen.

Problem ist halt, wenn ich so die Bedingung aufstelle wie du vorschlägst, dann knallt er mir ja viel zu viel weg... Aber ich probiere es Montag nochmal aus, glaube so hatte ich es am Anfang auch mal

eitch100 10.10.16 12:43

Ich habe das mit den Tagen jetzt erst geschnallt. Ich weiß nicht, ob das ohne Unterfunktion oder ohne das Definieren von Variablen geht, aber anscheinend brauchst du noch eine GROUP BY Anweisung, die die Zeilen nach dem Datum aus dem TimeStamp gruppiert. Also irgendwie in dieser Form:

DELETE FROM DeinTabellenname
WHERE TimeStamp < MAX(TimeStamp)
GROUP BY DateValue(TimeStamp)

Aber über die Syntax (besonders bei DateValue(TimeStamp)) bin ich mir sowas von überhaupt nicht sicher...:mad:

ulmilten 10.10.16 16:42

Kleines Update:
Habs hinbekommen ;)

Code:

DELETE
FROM
TabelleX AS A
WHERE
EXISTS
(
SELECT
NULL
FROM
TabelleX AS B
WHERE
DateValue(B.Timestamp) = DateValue(A.Timestamp)
AND
B.ISIN = A.ISIN
AND
B.TimeStamp < A. TimeStamp)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.