2016-07-09 7 views
0

私は20分前と2時間前の放棄日付を持つテーブルから人を奪おうとしています。これは、時間の適切な量をつかむようだが、すべての4時間古いです:Oracle Responsysの最後の1時間のカッターを放棄しました。

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) 

も、それは皆のためのすべてのレコードをつかみ、私はメールアドレスごと(最高abandondate)捨てられた最新の製品を求めています。私はこれを理解することができない。

答えて

0

結果が正確に4時間ある場合、タイムゾーンの不一致が存在する可能性があります。データベース内のABANDONDATEのEXACTデータ型は何ですか?おそらくタイムゾーンとタイムスタンプ? 4時間は、UTCとEDTの差(夏時間のオフセットがある東部アメリカ)のようです。

あなたの質問は、放棄された最新の製品のみを受け取るようにしましたか?あなたの質問のどの部分がそれをするでしょうか?代わりに、row_number() over (partition by [whatever identifies clients etc.] order by abandondate)を追加し、結果のクエリをサブクエリにして、WHERE句のrn = 1でフィルタする外側のクエリ内にラップします。テーブル構造(名前とデータ)を表示すると、テーブル内の列のタイプ - 関連する列のみ - プライマリキーを含む、またはプライマリキーです。

0

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 

別のアプローチを試してみてください

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_ 
) 
関連する問題