Except etwas erweitert - Problem

Michi_R

Fleissiger Benutzer
Beiträge
81
Hallo Leute,

ich bräuchte mal wieder eure Hilfe und ich bin mir sicher zusammen bekommen wir das hin:)

Ich hab in einer Event Tabelle die 4 Spalten ID (eindeutige Nummer die ein Teil beschreibt), Type (Werte IN oder OUT) und Name (Werte T1 bis T20...beschreibt einen bestimmten Träger in den das Teil gestellt oder entnommen wird), Datum der Transaktion (datetime format, hab ich jetzt nicht ins Beispiel eingetragen). Die Event Tabelle kann dann so aussehen:

unbenanntuyuaw.jpg
Grün markiert sind die Zeilen die ich haben will.

Ich möchte jetzt einen Query der mir sagt welche Teile gerade im Träger sind (also eine Liste aller Teile die sich in irgendeinem Träger T1 bis T20 befinden).

Normal würde ich hier einen except nehmen, alle mit IN minus alle mit OUT, dann bleiben die übrig die noch kein OUT haben.
Das Problem ist folgendes (s. Beispieltabelle): Es gibt Teile die erst mehrere INs haben (Prozessbedingt) und dann ein OUT für den Träger wo sie das neueste (Zeitlich, Datum ist auch dabei, falls das wichtig ist). Wenn ich jetzt mit except arbeite werden Teile die ein OUT haben dennoch für einen oder mehrere Träger angezeigt (da wo sie ein IN hatten aber kein OUT dazu).

Ich bräuchte jetzt einen query der mit folgendes liefert:
Falls nur IN: Teil anzeigen.
Falls mehrere IN, dann NUR für den Träger anzeigen wo das neueste IN kam.
Falls IN und OUT: Nicht anzeigen
Falls mehrere IN und OUT passend zum neuesten IN: Nichts anzeigen.

Ich bräuchte als eine Mischung aus Select max(date)....um die neusten INs zu bekommen und dann ein except aber das bekomm ich irgendwie nicht zusammen.

Wäre super wenn wer helfen könnte.
Danke!
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Mein Hauptproblem ist quasi:
Wenn ich zuerst

select max(date), id from event where type='IN' group by id

mache, dann kann ich den Type nicht mitnehmen und Ohne Type kein Except :(
 
Werbung:
Kannst doch dann dranjoinen, mit (max(date), id) kannst doch eindeutig den Typ finden, oder?

Code:
test=*# select * from michi order by id, name;
  id  | type | name
------+------+------
 1000 | in  |  1
 1000 | out  |  1
 1001 | in  |  2
 1001 | out  |  2
 1002 | in  |  3
 1003 | in  |  4
 1004 | in  |  5
 1004 | in  |  6
 1004 | in  |  7
 1005 | in  |  8
 1005 | in  |  9
 1005 | out  |  10
 1005 | in  |  10
(13 rows)

test=*# select * from michi where (id, name) in (select id, max(name) from michi where id not in ( select distinct id from michi where type = 'out') group by id order by id);
  id  | type | name
------+------+------
 1002 | in  |  3
 1004 | in  |  7
 1003 | in  |  4
(3 rows)
 
Zurück
Oben