2016-07-09 3 views
0

Ich versuche, Leute aus einer Tabelle zu packen, die ein Datum der Verabschiedung zwischen 20 Minuten und 2 Stunden haben. Dies scheint die richtige Menge an Zeit zu packen, aber alle 4 Stunden alt:Grab verlassene Carters von der letzten Stunde in Oracle Responsys

SELECT * 
FROM $A$ 
WHERE ABANDONDATE >= SYSDATE - INTERVAL '2' HOUR 
    AND ABANDONDATE < SYSDATE - INTERVAL '20' MINUTE 
    AND EMAIL_ADDRESS_ NOT IN(SELECT EMAIL_ADDRESS_ FROM $B$ WHERE ORDERDATE >= sysdate - 4) 

auch, es jeden Datensatz für jeden packt und ich möchte nur das neueste Produkt aufgegeben (höchste abandondate) für jede E-Mail-Adresse. Ich kann das anscheinend nicht herausfinden.

Antwort

0

Wenn die Ergebnisse EXAKT vier Stunden alt sind, ist es möglich, dass die Zeitzone nicht übereinstimmt. Was ist der EXACT-Datentyp von ABANDONDATE in Ihrer Datenbank? Vielleicht TIMESTAMP MIT TIMEZONE? Vier Stunden scheint der Unterschied zwischen UTC und EDT (Ost-USA mit Sommerzeit-Offset) zu sein.

Für Ihre andere Frage, haben Sie erwartet, dass Ihre Abfrage nur das aktuellste abgebrochene Produkt abholt? Welcher Teil Ihrer Abfrage würde das tun? Stattdessen müssen Sie row_number() over (partition by [whatever identifies clients etc.] order by abandondate) hinzufügen, die resultierende Abfrage zu einer Unterabfrage machen und sie in eine äußere Abfrage umwandeln, in der Sie filtern (WHERE-Klausel) rn = 1. Wir können Ihnen dabei helfen, wenn Sie uns die Tabellenstruktur (Name und Daten) zeigen Art der Spalten in der Tabelle - nur die relevanten Spalten - einschließlich welcher Primärschlüssel ist oder sind.

0

Versuchen

SELECT * FROM (
    SELECT t.*, 
      row_number() 
      over (PARTITION BY email_address__ ORDER BY ABANDONDATE DESC) As RN 
    FROM $A$ t 
    WHERE ABANDONDATE >= SYSDATE - INTERVAL '2' HOUR 
     AND ABANDONDATE < SYSDATE - INTERVAL '20' MINUTE 
     AND EMAIL_ADDRESS_ NOT IN(
      SELECT EMAIL_ADDRESS_ FROM $B$ 
      WHERE ORDERDATE >= sysdate - 4) 
) 
WHERE rn = 1 

einen anderen Ansatz

SELECT * 
FROM $A$ 
WHERE (EMAIL_ADDRESS_, ABANDONDATE) IN (
    SELECT EMAIL_ADDRESS_, MAX(ABANDONDATE) 
    FROM $A$ 
    WHERE ABANDONDATE >= SYSDATE - INTERVAL '2' HOUR 
      AND ABANDONDATE < SYSDATE - INTERVAL '20' MINUTE 
      AND EMAIL_ADDRESS_ NOT IN(
       SELECT EMAIL_ADDRESS_ FROM $B$ 
       WHERE ORDERDATE >= sysdate - 4) 
    GROUP BY EMAIL_ADDRESS_ 
) 
Verwandte Themen