2016-09-06 5 views
-1

Ich habe folgende Werte in einer Tabelle mit dem Namen CART:ausschließen Zeilen basierend auf den Werten auf anderen Zeilen

ID EMP_EMAIL  PRODUCT ACTIVITY_TYPE 
1 [email protected] Book Add 
2 [email protected] Book Remove 
3 [email protected] Kindle Add 
4 [email protected] Kindle Remove 
5 [email protected] Phone Add 
6 [email protected] Phone Remove 
7 [email protected] Book Add 

Am Ende muß ich mit nur einer Linie bleiben, die letzte Buch hinzufügen.

Die Zeilen sind in der Reihenfolge sortiert. Dies bedeutet, dass der Benutzer ein Buch ausgewählt hat. Dann entfernte das Buch und wählte einen Kindle. Dann entfernt der Kindle und wählte ein Telefon und so weiter.

Am Ende muss ich nur ausgeben, dass der Benutzer ein Buch ausgewählt.

Dieses Beispiel könnte auch einen Null-Ausgang hat:

ID EMP_EMAIL  PRODUCT ACTIVITY_TYPE 
1 [email protected] Book Add 
2 [email protected] Book Remove 
3 [email protected] Kindle Add 
4 [email protected] Kindle Remove 
5 [email protected] Phone Add 
6 [email protected] Phone Remove 

Dies nichts zurückgeben sollte als die letzte Aktion ein Entfernen war.

Ich bin offen für alle Vorschläge entweder in sql oder pl/sql.

+0

Werden die Anzeigen und entfernen immer abwechselnd? –

+0

Was hast du versucht? Oder möchten Sie, dass jemand von SO es für Sie erledigt? – XING

+0

Werden die Daten mehrere Werte für emp_email enthalten? Wenn ja, werden die Werte für jeden Wert fortlaufend nummeriert? Wie unterscheidet sich das von "die letzte Zeile abrufen, wenn der activity_type hinzugefügt wird"? Gewährleisten Sie, dass für eine gegebene emp_email die aufeinander folgenden Aktivitätsarten niemals identisch sind? Nicht genug Informationen in Ihrer Problembeschreibung - und SO existiert, um Ihnen zu helfen, ein Problem zu beheben, um Ihre Hausaufgaben für Sie nicht zu machen. – symcbean

Antwort

0

Wenn Sie alles auswählen möchten, das hinzugefügt, aber nicht entfernt wurde. Unter der Annahme, keine Duplikate:

select c.* 
from cart c 
where c.activity_type = 'Add' and 
     not exists (select 1 
        from cart c2 
        where c2.emp_email = c.emp_email and 
         c2.product = c.product and 
         c2.activity_type = 'Remove' 
       ); 

Wenn Sie Elemente auswählen möchten, die mehr haben fügt dann entfernt:

select c.emp_email, c.product 
from cart 
group by c.emp_email, c.product 
having sum(case when c.activity_type = 'Add' then 1 
       when c.activity_type = 'Remove' then -1 
      end) > 0; 
+0

@jpw. . . Guter Fang. Offensichtlich muss das OP mit Duplikaten umgehen. –

0

es wird die prodct Liste, die hinzugefügt wurden, aber nicht entfernt werden.

SELECT emp_email,product 
    FROM test 
    GROUP BY (emp_email,product) 
    HAVING CASE WHEN SUM(CASE activity_type WHEN 'Add' THEN 1 ELSE -1 END)!=0 THEN 1 ELSE 0 END =1; 
Verwandte Themen