UPDATE mit WHILE? kleine Knobelaugabe

ZENeca

Grünschnabel
Server-Typ: MariaDB
Server-Version: 10.5.23-MariaDB-1:10.5.23+maria~ubu2004-log - mariadb.org binary distribution
Protokoll-Version: 10

Hallo mal wieder,

ich bin am Überlegen, ob man folgende Aufgabe auch eleganter lösen kann
ich mache es im Moment mit einem Select ... spalte_2 ASC und einer folgenden Schleife mit den Updates
...aber schön wäre sicher etwas anderes

vorher:
spalte_1spalte_2
<egal>21:21:28
<egal>21:25:50
<egal>21:29:12
nachher
NOW()21:21:28
21:21:2821:25:50
21:25:5021:29:12

würde vermutlich auch kein Flaschenhals, da die Anzahl der Einträge überschaubar bleibt
ich kann mir aber gut vorstellen, daß es da bessere Lösungen gibt
...und ein Fallbeispiel für eine solche Aufgabe ist natürlich auch immer gut :)

merci und ein LG
Zen
 
Zuletzt bearbeitet:
Nehmen wir mal an die tabelle hat noch eine fortlaufende nummer, dann eventuell so (ungetestet)
SQL:
UPDATE myTable
LEFT JOIN myTable m2 ON m2.nummer=myTable.nummer + 1
SET myTable.spalte_1 = (CASE WHEN m2.nummer IS NULL THEN NOW() ELSE m2.spalte_2 END)
WHERE ...
 
Also wenn ich dich richtig verstanden habe:
erster Eintrag Spalte 1 soll "now" sein, erster Eintrag Spalte 2 wird übernommen
nächster Eintrag Spalte 1 ist gleich vorheriger Eintrag Spalte 2, aktueller Wert Spalte 2 wird übernommen?
usw.

Klingt nach LAG-Funktion: LAG

Und "fortlaufende" Nummern ist in der Regel "ROW_NUMBER()"-Funktion: ROW_NUMBER

EDIT: FREE AI-Enhanced Online MariaDB Compiler - For learning & practice
SQL:
CREATE TABLE tbl_spyke (
    ID    INTEGER,
    Col1    TIME,
    Col2    TIME);
INSERT INTO tbl_spyke (ID, Col1, Col2) VALUES (1, NULL, '21:21:28');
INSERT INTO tbl_spyke (ID, Col1, Col2) VALUES (2, NULL, '21:25:50');
INSERT INTO tbl_spyke (ID, Col1, Col2) VALUES (3, NULL, '21:29:12');

SELECT COALESCE(lag(Col2) OVER(ORDER BY Col2), current_time) As Col1, Col2
FROM tbl_spyke;

Da du ein UPDATE willst, wie wärs mit einem UPDATE FROM?
Update MariaDB table using a select query

ungetestet:
SQL:
UPDATE tbl_spyke
INNER JOIN
  (SELECT ID, COALESCE(lag(Col2) OVER(ORDER BY Col2), current_time) As Col1, Col2
   FROM tbl_spyke) As InnerSelect
ON tbl_spyke.ID=InnerSelect.ID
SET tbl_spyke.Col1=InnerSelect.Col1

EDIT2: Da ich MariaDB nicht nutze, habe ich keine Ahnung, welche/ob genannte Funktionen überhaupt zur Verfügung stehen (IIRC, das hat mit der Server-Version zu tun)
 
Zuletzt bearbeitet:
thx zvoni,
für mich hats sich schon gelohnt, LAG kannte ich noch nicht,
gleich ma geschaut, gibts auch in postgre.
 
thx zvoni,
für mich hats sich schon gelohnt, LAG kannte ich noch nicht,
gleich ma geschaut, gibts auch in postgre.
Wegen PostGres: Achte auf die "Default"-Option für Lag, welche es in MariaDB anscheinend nicht gibt.
Deshalb habe ich oben das COALESCE genommen.
In PostGres kannste ohne COALESCE arbeiten sondern direkt
PostgreSQL LAG() Function By Practical Examples

SQL:
SELECT Lag(Col2, 1, current_time) OVER(ORDER BY Col2).......

Generell für LAG-Funktion: Das absolut wichtige ist die ORDER BY-Klausel innerhalb des LAG-OVER-Ausdrucks. Sollte in der Regel mit der "eigentlichen" ORDER BY übereinstimmen (muss aber nicht)
 
Zurück