Захватите заброшенные картеры с последнего часа в 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. Мы можем помочь с этим, если вы покажете нам структуру таблицы (имя и тип данных столбцов в таблице - только соответствующие столбцы, в том числе первичный ключ).

Другие вопросы по тегам