Lead() in MariaDB

franks

Benutzer
Beiträge
6
Hallo,
ich möchte gerne in einer Datenbank Datumswerte von einer Zeile mit der Anderen vergleichen.
Lead() wird von meiner MarioDB nicht unterstützt.
Ich habe mir überlegt die Zeilen zu Nummerieren und dann bei der Abfrage mit +1 in die nächste Zeile zu springen.

SET @rank=0;
SELECT @rank := @rank+1 AS rank,von, bis
FROM gdat_termine1
ORDER BY von DESC
WHERE rank = 10

Die Zeile WHERE rank = 10 gibt einen Syntax Error. An was liegt das bzw. wie kann ich das datum in 2 verschiedenen Zeilen miteinander vergleichen?
 
Werbung:
wechsle doch einfach auf PostgreSQL und erfreue Dich an 1000 weiteren coolen Features.

Auf dem Server laufen mehrere Datenbanken. Kann es keine Probleme beim umstellen geben?
Ich habe gerade auf 10.4 / Debian upgedatet. Müsste jetzt Lead nicht auch funktionieren?

Select zimmer_nr, von, bis,
bis - lead (von)
over (order by von)
+ 1 as 'no_of_days'
from termine1;
 
Ich habe gerade auf 10.4 / Debian upgedatet. Müsste jetzt Lead nicht auch funktionieren?
Nein, müsste es nicht. Bzw. welches 10.4, welches Debian?

Debian 10.4?
Maria 10.4?

Debian ist nicht die Distribution, die besonders flott mit der Integration neuer Repos ist. Vielleicht wird da ein relativ altes Maria standardmäßig angeboten.
Du musst also nachlesen oder abfragen, welche Maria Version auf Deinem Debian im Einsatz ist. Am sichersten wäre dabei ein SQL Statement in der Maria Console, das die Version abfragt. Wenn das Ergebnis laut MariaDB ein Lead() kennt, kannst Du ein einfach Beispiel aus einem Tutorial ausprobieren, ob es wirklich so funktioniert wie erwartet.
Dann kannst Du Deine Abfrage angehen.

Bei Maria kenne ich die notwendigen Versionen und die von Debian bereitgestellte nicht. Bei Postgres weiß ich, dass es seit Jahren geht.
Alternativ musst Du Maria aus den neuesten Quellen zu Fuß auf dem Debian installieren (andere Repos einbinden, ..), was meist mit mehr Handarbeit und Fehlerquellen verbunden ist.
 
Hallo Franks,

aus deinem Beispiel geht leider nicht hervor welche Werte du vergleichen möchtest bzw. aus welcher ROW.

Um einfach die 10.te Zeile zu bekommen kannst du einfach LIMT 9,1 verwenden.

Code:
MariaDB [bernd]> select * from mytab;
+------+
| val  |
+------+
| r1   |
| r2   |
| r3   |
| r4   |
| r5   |
| r6   |
| r7   |
| r8   |
| r9   |
| r10  |
| r11  |
| r12  |
+------+
12 rows in set (0.00 sec)

MariaDB [bernd]> select * from mytab LIMIT 9,1;
+------+
| val  |
+------+
| r10  |
+------+
1 row in set (0.00 sec)

MariaDB [bernd]>

schreib einfach mal was du genau vergleichen möchtest und welche DB MySQL oder MariaDB du nutzt und welche Version.

Gruß
Bernd
 
Werbung:
@BerndB , was der Fragesteller sucht, mit Deiner Tabelle, ist wohl sowas:

Code:
test=# create table mytab(id int, val text);
CREATE TABLE
test=*# insert into mytab select s, 'r'||s::int from generate_series(1,12) s;
INSERT 0 12
test=*# select * from mytab ;
 id | val
----+-----
  1 | r1
  2 | r2
  3 | r3
  4 | r4
  5 | r5
  6 | r6
  7 | r7
  8 | r8
  9 | r9
 10 | r10
 11 | r11
 12 | r12
(12 rows)

test=*# select *, val || lag(val) over (order by id) as das_ist_gesucht from mytab ;
 id | val | das_ist_gesucht
----+-----+-----------------
  1 | r1  |
  2 | r2  | r2r1
  3 | r3  | r3r2
  4 | r4  | r4r3
  5 | r5  | r5r4
  6 | r6  | r6r5
  7 | r7  | r7r6
  8 | r8  | r8r7
  9 | r9  | r9r8
 10 | r10 | r10r9
 11 | r11 | r11r10
 12 | r12 | r12r11
(12 rows)

Oder, etwas anschaulicher, eine Aufsummierung von id:

Code:
test=*# select *, val || lag(val) over (order by id) as das_ist_gesucht, sum(id) over (order by id) as rolling_sum  from mytab ;
 id | val | das_ist_gesucht | rolling_sum
----+-----+-----------------+-------------
  1 | r1  |                 |           1
  2 | r2  | r2r1            |           3
  3 | r3  | r3r2            |           6
  4 | r4  | r4r3            |          10
  5 | r5  | r5r4            |          15
  6 | r6  | r6r5            |          21
  7 | r7  | r7r6            |          28
  8 | r8  | r8r7            |          36
  9 | r9  | r9r8            |          45
 10 | r10 | r10r9           |          55
 11 | r11 | r11r10          |          66
 12 | r12 | r12r11          |          78
(12 rows)

test=*#
 
Zurück
Oben