2016-10-22 2 views
3

Bitte gehen Sie durch diese bearbeitete Tabelle.So subtrahieren Sie die Daten von zwei Spalten in sql

enter image description here

Sie können nicht als Auftrag annehmen order_header_key.

Ich mag nos aktuellen Status das die Liste der Bestellung erhalten, ist 3 und vorheriger Zustand 2 war, und das Statusdatum (Status3) -Status Datum (2) < = 3 Tage diese Reihenfolge

in der folgende Tabelle für Bestell-Nr-1 'Datum (Status 3)' - ‚Datum (Status 2) = 20. Oktober - 19. Oktober , die weniger als 3 Tage ist -> So gültig um

aber für Best-Nr 3 "Datum (Status 3)" - "Datum (Status 2)" = 30 OCT - 24 OCT Das ist mehr als 3 Tage so ungültig Bestellung

Best-Nr 2 in ungültig, da die Zustände sind 3 und 1, 2

Antwort

3

einen Auftrag Unter der Annahme, kann nicht mehr als einen Eintrag haben pro order_no/Statuskombination fehlt, könnte man zwei Unterabfragen beitreten:

SELECT s3.order_no 
FROM (SELECT * 
     FROM orders 
     WHERE status = 3) s3 
JOIN (SELECT * 
     FROM orders 
     WHERE status = 2) s2 ON s3.order_no = s2.order_no AND 
           s3.status_date - s3.status_date <= 3 
+0

Hey vielen Dank für Ihre Antwort, ich die Frage nur bearbeitet .. eine Status der Bestellung wird in der Datenbank vor dem Datum gespeichert wird, ist es so etwas wie –

+0

Hey vielen Dank für Ihre Antwort, ich die Frage nur bearbeitet .. der Status eines Auftrags wird in der Datenbank gegen das Datum gespeichert, es ist so etwas wie –

+0

Hey danke für deine Antwort, ich habe gerade die Frage bearbeitet. Der Status einer Bestellung wird in der Datenbank gegen das Datum gespeichert, zum Beispiel Bestellnummer 1 der Status - Auftrag erstellt am 18., dann Auftrag am 19. versendet und am 20. geliefert –

3

Verwendung lag():

select o.* 
from (select o.*, 
      lag(o.status_date) over (partition by o.order_no order by o.status_date) as prev_sd, 
      lag(o.status) over (partition by o.order_no order by o.status_date) as prev_status 
     from orders o 
    ) o 
where prev_status = 2 and status = 3 and 
     (status_date - prev_sd) <= 3; 
+0

"Ordnung nach" ist obligatorisch in der analytischen Klausel für "lag()" (beide aus offensichtlichen logischen Gründen und durch Syntaxregeln erforderlich); Ohne sie wird die Abfrage nicht kompiliert. – mathguy

+0

@mathguy. . . Vielen Dank. Ich habe es einfach ausgelassen. –

+0

Eine kleine Frage, wenn ich den Datumunterschied zwischen zwei anderen Status (sagen wir Status 3 und 1) bekommen möchte, wie mache ich das? –

2

Analytische Funktionen (lag() in diesem Fall) können Sie verbindet und/oder Unterabfragen zu vermeiden, und kann (und oft) viel schneller sein.

with 
-- begin test data; not part of the solution 
    orders (order_no, status, status_date) as (
     select 1, 1, to_date('18-OCT-16', 'DD-MON-YY')from dual union all 
     select 1, 2, to_date('19-OCT-16', 'DD-MON-YY')from dual union all 
     select 1, 3, to_date('20-OCT-16', 'DD-MON-YY')from dual union all 
     select 1, 1, to_date('20-OCT-16', 'DD-MON-YY')from dual union all 
     select 1, 3, to_date('23-OCT-16', 'DD-MON-YY')from dual union all 
     select 1, 2, to_date('24-OCT-16', 'DD-MON-YY')from dual union all 
     select 1, 1, to_date('30-OCT-16', 'DD-MON-YY')from dual  
    ), 
-- end test data; solution is the word "with" from above, plus the query below  
    prep (order_no, status, status_date, prev_status, prev_status_date) as (
     select order_no, status, status_date, 
       lag(status) over (partition by order_no order by status_date), 
       lag(status_date) over (partition by order_no order by status_date) 
     from orders 
    ) 
select order_no 
from prep 
where status = 3 and prev_status = 2 and prev_status_date - status_date <= 3 
; 


ORDER_NO 
-------- 
     1 
Verwandte Themen