Выполнение среднего сложного SQL-запроса, и я столкнулся с этой ошибкой, которой я не могу найти хорошего объяснения, и я не встречал раньше:
Error in SQL statement: package.TreeNodeException: execute, tree:
Я включу весь запрос здесь как частьэтой проблемы является то, что я не могу выделить небольшой пример, который демонстрирует проблему:
WITH visits AS (
SELECT
visitor_key
, channel_vec AS digital_marketing_channel
, to_timestamp(date_time, "MM/dd/yyyy HH:mm") AS timestamp
, (HOUR(to_timestamp(date_time, "MM/dd/yyyy HH:mm")) / 24) + (MINUTE(to_timestamp(date_time, "MM/dd/yyyy HH:mm")) / (24 * 60)) AS days_carried
, conversion
FROM vectorised
), conversions_only AS (
SELECT
visitor_key
, conversion
, timestamp
, days_carried
, RANK() OVER(PARTITION BY visitor_key ORDER BY timestamp) AS conversion_rank
FROM visits
WHERE conversion = 1
), all_conversions AS (
SELECT
v.*
, MIN(conversion_rank) AS path_id
FROM visits v
JOIN conversions_only c ON v.visitor_key = c.visitor_key
WHERE v.timestamp <= c.timestamp
GROUP BY
v.visitor_key
, v.digital_marketing_channel
, v.timestamp
, v.days_carried
, v.conversion
), converted_paths AS (
SELECT
a.*
, CASE
WHEN path_id > 1 THEN 1
ELSE 0
END AS previous_conversion
, DATEDIFF(c.timestamp, a.timestamp) + c.days_carried - a.days_carried AS path_days_remaining
, 1 AS converted_path
FROM all_conversions a
JOIN conversions_only c ON a.visitor_key = c.visitor_key AND a.path_id = c.conversion_rank
), all_paths AS (
SELECT
visitor_key
, 0 AS path_id
, digital_marketing_channel
, conversion
, DATEDIFF("2019-04-02", timestamp) - days_carried AS path_days_remaining
, 0 AS converted_path
, 0 AS previous_conversion
FROM visits
WHERE visitor_key NOT IN (SELECT DISTINCT visitor_key FROM all_conversions)
UNION ALL
SELECT
visitor_key
, path_id
, digital_marketing_channel
, conversion
, path_days_remaining
, converted_path
, previous_conversion
FROM converted_paths
), steps AS (
SELECT
*
, ROW_NUMBER() OVER(PARTITION BY visitor_key, path_id ORDER BY path_days_remaining, conversion DESC) AS step_id
FROM all_paths
WHERE conversion = 0
ORDER BY visitor_key, path_id, path_days_remaining DESC, conversion
), output AS (
SELECT
visitor_key
, path_id
, pad_matrix(collect_list(digital_marketing_channel), 10) AS channels
, collect_list(path_days_remaining) AS days_remaining
, converted_path
, previous_conversion
FROM steps
WHERE step_id < 11
GROUP BY
visitor_key
, path_id
, converted_path
, previous_conversion
), helper AS (
SELECT
visitor_key
, path_id
, converted_path
, previous_conversion
, COUNT(*) AS steps
FROM all_paths
GROUP BY
visitor_key
, path_id
, converted_path
, previous_conversion
)
SELECT
*
FROM helper
WHERE converted_path = 0
Проблема, как представляется, возникла в вспомогательной таблице "помощник" и в последнем операторе выбора и кажется специфическойк этому элементу convert_path = 0, при этом convert_path представляет собой столбец, содержащий 0 и 1.Чтобы усложнить ситуацию, использование
WHERE converted_path = 1
работает, тогда как
WHERE converted_path != 1
вызывает ту же ошибку.Перемещение оператора where в таблицу «helper» вызывает ту же проблему.Я могу выполнить точно такой же анализ для других столбцов без проблем, проблема только для столбца convert_path.Если я сохраню вывод нефильтрованной «вспомогательной» таблицы в виде таблицы в базе данных, то смогу выполнить запрос фильтра по мере необходимости для новой таблицы.Аналогичным образом, если я сохраню форму «all_paths», которую «помощник» рисует как новую таблицу, я могу выполнить «помощник» и последний отфильтрованный оператор выбора select в сохраненной таблице «all_paths».
Очевидно, что этопроблема, которую я могу обойти, поэтому меня больше беспокоит то, что происходит что-то, чего я принципиально не понимаю, возможно, в под-таблице all_paths, где встречается оператор union?Был бы очень признателен, если бы кто-то мог указать мне правильное направление на то, чего мне не хватает.
Спасибо!