CTE 的 CROSS JOINing 和 CROSS JOINing TRANSIENT TABLES 之间的不同输出
Different outputs between CROSS JOINing of CTE and CROSS JOINing TRANSIENT TABLES
(代表 Snowflake 用户提交问题)
我在使用 CTE 和 CROSS JOINS 时得到不正确的输出。
但是在创建 TRANSIENT TABLES 而不是 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
;
我做错了什么?有什么想法、建议等吗?
看来您发现了一个错误,除非我们在 window 函数的文档中遗漏了一些很好的文字。
问题出在 class
CTE 中的 (ORDER BY 1)
。如果您将 1
更改为任何其他常量,例如 0
,它会起作用。去图吧!
(代表 Snowflake 用户提交问题)
我在使用 CTE 和 CROSS JOINS 时得到不正确的输出。
但是在创建 TRANSIENT TABLES 而不是 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
;
我做错了什么?有什么想法、建议等吗?
看来您发现了一个错误,除非我们在 window 函数的文档中遗漏了一些很好的文字。
问题出在 class
CTE 中的 (ORDER BY 1)
。如果您将 1
更改为任何其他常量,例如 0
,它会起作用。去图吧!