2017-01-17 5 views
0

Я пытаюсь выполнить следующий запрос к моему набору данных, хранящимся в Redshift:Redshift подзапроса не приняло

SELECT v_users.user_id AS user_id, 
    v_users.first_name AS first_name, 
    v_users.email AS email, 
    COALESCE(v_users.country, accounts.region) AS country_code, 
    profiles.language AS language, 
    v_users.mobilenum AS mobile_num, 
    NULL as mobile_verification_date, 
    COALESCE(v_users.registration_date, accounts.date_created) AS activation_date, 
    EXISTS (SELECT 1 
      FROM cds.user_session_201612 AS users_session, 
        cds.access_logs_summary_201612 AS access_logs_summary, 
        views_legacy AS views_legacy 
      WHERE users_session.userid = v_users.user_id 
       OR access_logs_summary.userid = v_users.user_id 
       OR views_legacy.user_id = v_users.user_id) AS has_viewed, 
    NULL as preferred_genre_1, 
    NULL as preferred_genre_2, 
    NULL as preferred_genre_3 
FROM users AS v_users, 
    users_metadata AS v_users_metadata, 
    account.account AS accounts, 
    account.profile AS profiles 
WHERE accounts.id = v_users.user_id 
    AND profiles.id = v_users.user_id 
    AND v_users_metadata.user_id = v_users.user_id 

Проблема, которую я получаю следующее:

ERROR: This type of correlated subquery pattern is not supported due to internal error 

, которое вызывается подзапрос, но как я могу его решить? можете ли вы дать мне несколько предложений?

+0

Могу ли я спросить, почему вы используете 4 декартовых продукта в своем заявлении о соединении? –

+0

@HaleemurAli Вы можете это уточнить? – Mazzy

+0

@ HaleemurAli ok Я понял, что вы имеете в виду. Я использую 4 декартовых продукта, потому что мне нужно получить данные из этих разных таблиц – Mazzy

ответ

0

Redshift не разрешает коррелированные подзапросы в предложении SELECT, который, как я считаю, не является ограничением, поскольку все примеры, с которыми я столкнулся, могут быть выражены иначе.

Я отредактировал подзапрос как CTE и использовал left join с is not null, чтобы отметить пользователей, которые просмотрели или не просмотрели некоторые вещи.

Этот конкретный запрос ниже не может работать, но любое решение, скорее всего, примет следующий вид:

WITH has_viewed AS (
    SELECT 
     u.user_id 
    FROM users u 
    LEFT JOIN cds.user_session_201612 AS users_session 
     ON users_session.userid = u.user_id 
    LEFT JOIN cds.access_logs_summary_201612 AS access_logs_summary 
     ON access_logs_summary.userid = users.user_id 
    LEFT JOIN views_legacy 
     ON views_legacy.user_id = v_users.user_id 
    WHERE users_session.userid IS NOT NULL 
    OR access_logs_summary.userid IS NOT NULL 
    OR views_legacy.user_id 
    GROUP BY 1 
) 
SELECT 
    v_users.user_id AS user_id 
, v_users.first_name AS first_name 
, v_users.email AS email 
, COALESCE(v_users.country, accounts.region) AS country_code 
, profiles.language AS language 
, v_users.mobilenum AS mobile_num 
, NULL as mobile_verification_date 
, COALESCE(v_users.registration_date, accounts.date_created) AS activation_date 
, has_viewed.user_id IS NOT NULL AS has_viewed 
, NULL as preferred_genre_1 
, NULL as preferred_genre_2 
, NULL as preferred_genre_3 
FROM users AS v_users 
JOIN users_metadata AS v_users_metadata 
    ON v_users_metadata.user_id = v_users.user_id 
JOIN account.account AS accounts 
    ON accounts.id = v_users.user_id 
JOIN account.profile AS profiles ON profiles.id = v_users.user_id 
LEFT JOIN has_viewed 
     ON has_viewed.user_id = v_users.user_id 
0

Я пробовал все возможные комбинации,

  1. SELECT подзапрос не работает
  2. CTE (Common Table Expression), как показано Haleemur Ali, также не работает.

Теперь, что я пробовал - мне нужна была альтернатива GROUP BY, так как redshift не принимает GROUP BY. Итак, я получил это решение -

ключевое слово OVER.

SO в качестве замены для GROUP BY я OVER и PARTITION BY, который идет как -

SELECT * 
FROM (
    SELECT *,ROW_NUMBER() 
    OVER (PARTITION BY **VARIOUS COLUMNS** ORDER BY datetime DESC) rn 
    FROM schema.tableName 
) derivedTable 
WHERE derivedTable.rn = 1; 

Может OVER может помочь вам. Хотя я не уверен.