Невозможно сравнить данные со столбцом в таблице, созданной с помощью предложения WITH (Presto) - PullRequest
0 голосов
/ 18 сентября 2018

Я использую консоль Amazon Athena, которая использует presto. Я использовал следующее предложение WITH, чтобы получить только самую раннюю запись для каждого покупателя, который купил велосипед в таблице "product_delivery":

WITH t1 AS 
    (SELECT customer_code, product_type, date_stamp
     FROM "products"."product_delivery" f1
     WHERE product_code like '%bike%'
     AND date_stamp = (SELECT MAX(date_stamp) 
         FROM "products"."product_delivery" f2 
         WHERE f1.product_code=f2.product_code)
    )

Затем я попытался найти тех же клиентов в исходной таблице доставки, которые покупали перчатки на дату позже даты, когда они получили свой первый велосипед:

SELECT * 
FROM "products"."product_delivery" f3
WHERE customer_code IN (SELECT customer_code from t1)
AND product_code like '%gloves%'
AND (f3.date_stamp>t1.date_stamp WHERE f3.customer_code=t1.customer_code)

Когда я это делаю, я получаю сообщение об ошибке «column t1.date_stamp», которое невозможно устранить, даже если я создал t1 со столбцом date_stamp чуть выше.

Как можно сравнить данные из таблицы с данными в таблице, созданной с помощью предложения WITH? Существует ли другой синтаксис для указания столбца, когда таблица составлена ​​с предложением WITH?

1 Ответ

0 голосов
/ 18 сентября 2018

у вас нет соединения с t1 в f3, в результате вы не можете использовать столбец date_stamp подзапроса t1 в предложении where, сначала присоединитесь к ним и используйте, как показано ниже

    With t1 AS (
        SELECT customer_code, product_type, date_stamp
        FROM "products"."product_delivery" f1
        WHERE product_code like '%bike%'
        AND date_stamp = (SELECT MAX(date_stamp)
        from  "products"."product_delivery" f2
        WHERE f1.product_code=f2.product_code)
      ) ,
      t2 as    
     (
     SELECT * 
     FROM "products"."product_delivery" f3
     join t1 on f3.customer_code=t1.customer_code
     WHERE 
    customer_code IN (SELECT customer_code from t1) // as joined so this condition not required
    AND f3.product_code like '%gloves%'
    AND f3.date_stamp>t1.date_stamp
     )  select * from t2
...