Различные выходы между CROSS JOINING CTE и CROSS JOINING TRANSIENT TABLES - PullRequest
0 голосов
/ 21 октября 2019

(Отправка вопроса от имени пользователя Snowflake)


Я получаю неправильный вывод при использовании CTE и CROSS JOINS.

Но правильный выводпри создании переходных таблиц вместо CTE:

Главный виновник - CLASS CTE

WITH
vennDimension AS
(
  SELECT ROW_NUMBER() OVER (ORDER BY 1) -1 AS TIMEPERIOD
         FROM TABLE(GENERATOR(ROWCOUNT => 2+1))
  ),
nonVennDimension AS
(
  SELECT ROW_NUMBER() OVER (ORDER BY 1) AS PRODUCT
         FROM TABLE(GENERATOR(ROWCOUNT => 2+1))
  ),
class AS
(
  SELECT *, CASE WHEN MOD(CLASS, 2) >= 1 THEN 1 ELSE 0 END AS Venn_Group1 , 
CASE WHEN MOD(CLASS, 4) >= 2 THEN 1 ELSE 0 END AS Venn_Group2 
     FROM
      (SELECT ROW_NUMBER() OVER (ORDER BY 1) AS CLASS FROM TABLE(GENERATOR(ROWCOUNT => 3 ))        )b
  ),
view_type AS
(
  SELECT * FROM VALUES (1),(2) AS tmp(view_type)
)
SELECT * FROM class
cross join (
SELECT  * FROM (
   SELECT *  FROM
   vennDimension v  --all venn groups plus total
          CROSS JOIN nonVennDimension nv--secondary groups
) a
CROSS JOIN (SELECT * FROM view_type) c
) a
WHERE PRODUCT=1 AND TIMEPERIOD=0
;

. Вот правильный вывод:

CREATE TRANSIENT TABLE 
vennDimension_table AS
(
  SELECT ROW_NUMBER() OVER (ORDER BY 1) -1 AS TIMEPERIOD
         FROM TABLE(GENERATOR(ROWCOUNT => 2+1))
  )
  ;

CREATE TRANSIENT TABLE 
nonVennDimension_table AS
(
  SELECT ROW_NUMBER() OVER (ORDER BY 1) AS PRODUCT
         FROM TABLE(GENERATOR(ROWCOUNT => 2+1))
  )
 ;

CREATE TRANSIENT TABLE 
class_table AS
(
  SELECT *, CASE WHEN MOD(CLASS, 2) >= 1 THEN 1 ELSE 0 END AS Venn_Group1 , 
CASE WHEN MOD(CLASS, 4) >= 2 THEN 1 ELSE 0 END AS Venn_Group2 
     FROM
      (SELECT ROW_NUMBER() OVER (ORDER BY 1) AS CLASS FROM TABLE(GENERATOR(ROWCOUNT => 3 ))        )b
  );

CREATE TRANSIENT TABLE 
view_type_table AS
(
  SELECT * FROM VALUES (1),(2) AS tmp(view_type)
)
;

SELECT * FROM  class_table a
CROSS JOIN view_type_table b
CROSS JOIN nonvenndimension_table c
CROSS JOIN venndimension_table d
WHERE PRODUCT = 1 AND TIMEPERIOD=0
;

Что я делаю неправильно? Любые мысли, рекомендации и т. Д.?

1 Ответ

0 голосов
/ 21 октября 2019

Похоже, вы нашли ошибку, если только мы не пропустили некоторые мелкие записи в документации по оконным функциям.

Проблема в (ORDER BY 1) в class CTE. Если вы измените 1 на любую другую константу, например 0, это сработает. Иди разберись!

...