Почему подзапрос не работает в Snowflake?

#sql #snowflake-cloud-data-platform #snowflake-schema

Вопрос:

Я пытаюсь выполнить этот запрос в Snowflake, но продолжаю получать сообщение об ошибке.

 select x.*, (select z.status from TBLA z where z.number_id=x.number_id and z.country=x.country and z.datetime=x.datetime) status
from
(
    select a.number_id, a.country, max(datetime) as datetime
    from TBLA a
    group by a.number_id, a.country
) x
 

Это ошибка, которую я получаю:

 SQL compilation error: Unsupported subquery type cannot be evaluated
 

Кто-нибудь знает, как это исправить?

Комментарии:

1. Есть ли причина использовать подзапрос для статуса, а не просто присоединять TBLA к таблице x?

Ответ №1:

Чтобы получить статус для последней даты и времени для number_id / country, можно использовать оконную функцию:

 SELECT a.*, 
  (ARRAY_AGG(a.status) WITHIN GROUP(ORDER BY a.datetime DESC) 
                       OVER(PARTITION BY a.number_id, a.country))[0] AS latest_status
FROM TBLA a;
 

Ответ №2:

Похоже, вы пытаетесь получить последний статус по number_id и country. Простой запрос для выполнения этого в Snowflake с использованием оконной функции row_number()

 select * from TBLA
qualify row_number() over (partition by number_id, country order by datetime desc) = 1;
 

Ответ №3:

В SELECT разрешены только скалярные подзапросы. Ваш подзапрос по своей сути не является скалярным.

https://docs.snowflake.com/en/user-guide/querying-subqueries.html