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

如果结果正好是四个小时前,则可能存在时区不匹配。您的数据库中 ABANDONDATE 的确切数据类型是什么?也许带有时区的时间戳?四个小时似乎是 UTC 和 EDT(美国东部夏令时偏移)之间的差异。

对于您的另一个问题,您是否期望您的查询仅获取最近被放弃的产品?您的查询的哪一部分会这样做?相反,您需要添加row_number() over (partition by [whatever identifies clients etc.] order by abandondate),将生成的查询放入子查询中,并将其包装在您按(WHERE 子句)rn = 1 过滤的外部查询中。如果您向我们展示表结构(名称和数据类型),我们可以提供帮助表中的列 - 仅相关列 - 包括哪些是主键或哪些是主键)。

于 2016-07-09T22:07:38.747 回答