Захватите заброшенные картеры с последнего часа в Oracle Responsys
Я пытаюсь вытащить из-за стола людей, у которых есть свидание от 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)
Кроме того, он захватывает каждую запись для всех, и я хочу, чтобы только самый последний продукт был отменен (самый высокий отказ) для каждого адреса электронной почты. Я не могу понять это.
2 ответа
Пытаться
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_
)
Если результаты Ровно четыре часа, возможно, существует несоответствие часового пояса. Каков ТОЧНЫЙ тип данных ABANDONDATE в вашей базе данных? Возможно, TIMESTAMP с TIMEZONE? Четыре часа кажутся разницей между UTC и EDT (восток США со смещением летнего времени).
По другому вопросу: ОЖИДАЛИ ли вы, что ваш запрос забрал только самый последний оставленный товар? Какая часть вашего запроса будет делать это? Вместо этого вам нужно добавить row_number() over (partition by [whatever identifies clients etc.] order by abandondate)
, превратить полученный запрос в подзапрос и обернуть его во внешний запрос, где вы фильтруете (предложение WHERE) rn = 1. Мы можем помочь с этим, если вы покажете нам структуру таблицы (имя и тип данных столбцов в таблице - только соответствующие столбцы, в том числе первичный ключ).