0

20 分前から 2 時間前までの間に放棄日がある人をテーブルから引き出そうとしています。これは適切な時間を確保しているように見えますが、すべて 4 時間経過しています。

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)

また、すべてのユーザーのすべてのレコードを取得し、メール アドレスごとに放棄された最新の製品 (放棄日が最も長いもの) のみを取得します。私はこれを理解できないようです。

4

2 に答える 2

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_
)
于 2016-07-10T04:58:53.540 に答える
0

結果が正確に 4 時間経過している場合は、タイム ゾーンが一致していない可能性があります。データベースの ABANDONDATE の EXACT データ型は何ですか? TIMESTAMP WITH TIMEZONE ではないでしょうか。4 時間は、UTC と EDT (夏時間オフセットのある米国東部) の違いのようです。

もう 1 つの質問については、クエリが放棄された最新の製品のみをピックアップすることを期待していましたか? クエリのどの部分がそれを行いますか? 代わりに、 を追加row_number() over (partition by [whatever identifies clients etc.] order by abandondate)し、結果のクエリをサブクエリにし、(WHERE 句) rn = 1 でフィルター処理する外側のクエリ内にラップする必要があります。テーブル構造 (名前とデータ型) を示していただければ、これを支援できます。テーブル内の列の数 - 関連する列のみ - 主キーまたは主キーである列を含む)。

于 2016-07-09T22:07:38.747 に答える