Spezielles Update

dherr

Benutzer
Beiträge
10
Hallo zusammen,
mein Problem ist Folgendes:
In meiner Datentabelle sieht es derzeit so aus;
sql datum.png
Ich möchte nun eventuell mit einem Update immer die nächsten NULL-Werte ersetzen mit bspw. 04.01.2024 die derzeit NULL sind bis zu 05.01.2024,
dann von 05.01.2024 bis 06.01.2024 usw.
Bisher habe ich dazu noch keine Möglichkeit gefunden, Weiß jemand Rat?
Grüße - Dietrich
 
Werbung:
Weiß jemand Rat?

Ich denke, das wird schwierig. Es sei denn, Du hast nicht alle Spalten gezeigt.
Wenn Deine Tabelle tatsächlich so aussieht, wie Du zeigst, dann gibt es kein Kriterium für "nächsten NULL Wert".
Was Du dort abfragst bzw. wie, in welcher Reihenfolge es ausgegeben wird, ist mehr oder weniger Zufall. Erst wenn Du ein Order By angibst und dazu auch ein taugliches Sortierkriterium, erst dann hast Du eine Chance, Dein Update mit einem aufaddierten Datumswert des vorigen Datensatzes durchzuführen. (Das gilt grundsätzlich, nicht nur in Deinem Beispiel)

In Deinem Beispiel fehlen nicht nur erkennbar taugliche Daten, es fehlt auch eine Spaltenbenennung, anhand derer man ahnen könnte, was in den Spalten stehen könnte wo sich jetzt NULL Werte befinden.
 
Die Spalte heißt "Day" und es gibt nur noch eine ID-Spalte (Primärschlüssel), wo die Datensätze durchnummeriert sind. Diese Day-Spalte ist derzeit noch nvarchar(50).
Ich weiß, dass es schwierig ist, habe selbst viel ausprobiert, aber jetzt wollte ich mir eben einen Rat holen...
 
Hi, da keine Antworten kommen habe ich mich einmal versucht. Kenne mich besser in MySQL aus.

So sollte es aber gehen, wenn ich dein Problem richtig verstanden habe.
Code:
WITH LastValidDates AS (
    SELECT
        id,
        day,
        COALESCE(day, LAG(day) OVER (ORDER BY id)) AS LastValidDay
    FROM
        mytable
),
FilledDates AS (
    SELECT
        id,
        day,
        CASE
            WHEN day IS NULL THEN MAX(LastValidDay) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
            ELSE day
        END AS FilledDay
    FROM
        LastValidDates
)
UPDATE mytable
SET day = f.FilledDay
FROM mytable m
JOIN FilledDates f ON m.id = f.id
WHERE m.day IS NULL;

Hier ein ein komplettes Beispiel: dbfiddle.uk

Gruß Bernd
 
Hallo Bernd, danke für deinen Tipp!! Das muss ich unbedingt mal ausprobieren. Hoffentlich funktioniert es auch bei meinem SSMS Version 19.2.
Melde mich später.
Grüße - Dietrich
 
Hallo Bernd und an Alle,

dieser Tipp ist SUPER! Funktioniert!👍👍👍 Ich gebe zu, darauf wäre ich nicht gekommen...☺️
Also, man lernt immer wieder dazu. Ich werde diese Methode sehr gut in meinem Archiv abspeichern.

Grüße - Dietrich
 
Hallo Dietrich,

immer gerne. Das geht bestimmt aber besser und/oder einfacher. Ich halt nicht das wo ich mich so tief auskenne.

Gruß Bernd
 
Werbung:
Mir fällt jetzt auch kein wirklich schlankerer Weg ein. Da es sich scheinbar um eine einmalige Sache handelt könnte man noch ein UPDATE immer wieder drüber laufen lassen bis alle Lücken geschlossen sind oder einen Subselect ins UPDATE Statement knüppeln der für jeden fehlenden Wert den letzten Wert bestimmt. Also etwa so:
Code:
UPDATE tabelle SET tabelle.day = ( SELECT max(t.day) FROM tabelle t WHERE t.day IS NOT NULL AND t.id < tabelle.id ) WHERE tabelle.day IS NULL
 
Zurück
Oben