Spalten und Zeilen vergleichen

robinfire

Neuer Benutzer
Beiträge
2
Hallo Zusammen

Ich habe in einer Tabelle eine Spalte mit den Schlüsseln 100 und 101. In einer zweiten Spalte befindet sich das Datum an dem jeweils ein Schlüssel gesetzt wurde.
z.B
ID | Schlüssel | Datum
1 | 101 | 20141228172425
1 | 100 | 20141020132300
2 | 101 | 20140926162112
2 | 100 | 20141118121401

Ich benötige jetzt alle Einträge mit der selben ID bei denen das Datum mit dem Schlüssel 100 kleiner ist als bei dem Eintrag mit dem Schlüssel 101. Im Beispiel währen das alle Einträge mit der ID 1

Ein Subquery kann ich nicht richtig nutzen das das Subqery mehr als nur ein Eintrag ausgeben würde.
Code:
SELECT * FROM Schluesselverwaltung
WHERE (Schluesseldatum = 
(SELECT Schluesseldatum FROM Schluesselverwaltung WHERE Schluesselnummer = 100))
< 
(Schluesseldatum = 
(SELECT Schluesseldatum FROM Schluesselverwaltung WHERE Schluesselnummer = 101))


Könnt ihr mir dazu bitte einen Rat geben?

Vielen Dank und Grüsse
Robin
 
Werbung:
Könnt ihr mir dazu bitte einen Rat geben?

Vielen Dank und Grüsse
Robin

Um auf Werte in anderen Rows (n rows davor oder danach zum aktuellen) zugreifen zu können gibt es Window-Funktionen lag() und lead() - allerdings noch nicht in MySQL.

Damit könntest Du so vorgehen:

Code:
test=*# select * from robin ;
 id | key |  datum
----+-----+----------------
  1 | 101 | 20141228172425
  1 | 100 | 20141020132300
  2 | 101 | 20140926162112
  2 | 100 | 20141118121401
(4 rows)

Time: 0,182 ms
test=*# select distinct id from (select id, key, datum, datum - lag(datum) over (partition by id order by key desc) as x from robin) bla where x is not null and x < 0 ;
 id
----
  1
(1 row)

Damit hast Du Deine ID = 1, damit kannst nun weiter arbeiten.

Vielleicht findest bei stackoverflow oder woanders einen Ersatz für lag() unter MySQL. Oder Du steigst um auf eine DB, die das und mehr kann, z.B. PostgreSQL.

Ach ja: Du hast einen komischen Datentyp für Datum. MySQL hat und kann nicht viel, es hat aber immerhin einen passenden Datentyp für Datum / Timestamp. Nutze diese.
 
Wie wärs damit?
Code:
SELECT    *
FROM    tabelle
WHERE    ID IN (

SELECT    t1.ID
FROM    tabelle t1
INNER JOIN tabelle t2
ON        t1.ID = t2.ID
AND        t1.Schluessel = 100
AND        t2.Schluessel = 101
AND        t1.Datum < t2.Datum

)
 
Werbung:
Hallo,

hier die etwas andere Version

Erst mal alle Zeilen
Code:
mysql> SELECT * FROM tabelle;
+----+------------+---------------------+
| id | schluessel | datum               |
+----+------------+---------------------+
|  1 |        101 | 2014-12-28 17:24:25 |
|  2 |        101 | 2014-09-26 16:21:12 |
|  1 |        100 | 2014-10-20 13:23:00 |
|  2 |        100 | 2014-11-18 12:14:01 |
+----+------------+---------------------+
4 rows in set (0,00 sec)

Nur noch die mit schluessel 100
Code:
mysql> SELECT id100.*
    -> FROM tabelle id100
    -> WHERE schluessel  = 100;
+----+------------+---------------------+
| id | schluessel | datum               |
+----+------------+---------------------+
|  1 |        100 | 2014-10-20 13:23:00 |
|  2 |        100 | 2014-11-18 12:14:01 |
+----+------------+---------------------+
2 rows in set (0,00 sec)

Und nun alle wo das Datum der id100 kleiner ist als die bei id101
Code:
mysql> SELECT id100.* , id101.*
    -> FROM tabelle id100
    -> LEFT JOIN tabelle id101 ON id100.id=id101.id
    -> WHERE id100.schluessel  = 100
    -> AND id100.datum < id101.datum;
+----+------------+---------------------+------+------------+---------------------+
| id | schluessel | datum               | id   | schluessel | datum               |
+----+------------+---------------------+------+------------+---------------------+
|  1 |        100 | 2014-10-20 13:23:00 |    1 |        101 | 2014-12-28 17:24:25 |
+----+------------+---------------------+------+------------+---------------------+
1 row in set (0,00 sec)

Du kannst nun die Felder id100.* bzw id101.* einzeln angeben, damit du nur
die notwendigen Spalten erhälst zB. id101.datum, id101.datum

Gruss

Bernd
 
Zurück
Oben