我正在试着把那些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)此外,它为每个人抓取每一条记录,我只想为每个电子邮件地址放弃最近的产品(最高放弃日期)。我似乎想不通这件事。
发布于 2016-07-10 06:07:39
如果结果正好是四小时前的,则可能存在时区不匹配。您的数据库中ABANDONDATE的确切数据类型是什么?也许是带有时区的时间戳?四个小时似乎是UTC和美国东部时间(美国东部,夏令时偏移)之间的差异。
对于你的另一个问题,你期望你的查询只挑选最近放弃的产品吗?您的查询中的哪一部分会这样做?相反,您需要添加row_number() over (partition by [whatever identifies clients etc.] order by abandondate),使结果查询成为一个子查询,并将其包装在一个外部查询中,在该外部查询中,您可以通过(WHERE子句) rn = 1进行过滤。如果您向我们显示表结构(表中列的名称和数据类型-仅相关列-包括哪些是主键或哪些是主键),我们可以提供帮助。
发布于 2016-07-10 12:58:54
试一试
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_
)https://stackoverflow.com/questions/38286471
复制相似问题