Предоставление SQL-запроса: Ошибка в операторе SQL: package.TreeNodeException: execute, tree: - PullRequest
0 голосов
/ 10 апреля 2019

Выполнение среднего сложного 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?Был бы очень признателен, если бы кто-то мог указать мне правильное направление на то, чего мне не хватает.

Спасибо!

...