下面的SQL返回错误AnalysisException: Duplicate column name: all_periods_int
DROP TABLE IF EXISTS temp_nielsen_other_upc_all_markets_test;
CREATE TABLE IF NOT EXISTS temp_nielsen_other_upc_all_markets_test
PARTITIONED BY (all_periods_int)
STORED AS PARQUET
AS
SELECT
COALESCE(gap.all_markets,fct.all_markets) AS all_markets,
COALESCE(gap.all_periods, fct.all_periods) AS all_periods,
NVL(gap.dollar,0) - NVL(fct.dollar,0) AS dollar,
(CAST(SUBSTR(COALESCE(gap.all_periods,fct.all_periods),7,2) AS int)+2000)*10000+CAST(SUBSTR(COALESCE(gap.all_periods,fct.all_periods),1,2) AS int)*100+CAST(SUBSTR(COALESCE(gap.all_periods,fct.all_periods),4,2) AS int) AS all_periods_int
FROM temp_nielsen_gap_total_all_markets_raw gap
FULL OUTER JOIN(
SELECT
all_markets,
all_periods,
SUM(dollar) AS dollar
FROM temp_nielsen_sku_facts_all_markets_raw
GROUP BY all_markets,
all_periods
) fct
ON( gap.all_markets = fct.all_markets AND
gap.all_periods = fct.all_periods
)
WHERE ABS(NVL(gap.dollar,0) - NVL(fct.dollar,0)) > 1 AND
fct.all_markets in (SELECT DISTINCT all_markets FROM temp_nielsen_gap_total_all_markets_raw);列all_periods_int是由这个SQL创建的,它不存在于两个底层表中的任何一个中。
另外,另一件奇怪的事情是,以下两种方案都运行良好:
WHERE语句fct.all_markets in (SELECT DISTINCT all_markets FROM temp_nielsen_gap_total_all_markets_raw)中没有第二个条件的情况下运行完整语句;CREATE TABLE语句的CREATE TABLE语句即可。我看不出有什么地方可以复制all_periods_int。
发布于 2018-03-05 22:06:53
所以问题是,分区变量只能在分区BY子句中引用,而不能在SELECT语句中引用。但是,在SELECT中生成变量时,需要嵌套以下步骤:
DROP TABLE IF EXISTS temp_nielsen_other_upc_all_markets_test;
CREATE TABLE IF NOT EXISTS temp_nielsen_other_upc_all_markets_test
PARTITIONED BY (all_periods_int)
STORED AS PARQUET
AS
SELECT
all_markets
, all_periods
, dollars
FROM
(
SELECT
COALESCE(gap.all_markets,fct.all_markets) AS all_markets,
COALESCE(gap.all_periods, fct.all_periods) AS all_periods,
NVL(gap.dollar,0) - NVL(fct.dollar,0) AS dollar,
(CAST(SUBSTR(COALESCE(gap.all_periods,fct.all_periods),7,2) AS int)+2000)*10000+CAST(SUBSTR(COALESCE(gap.all_periods,fct.all_periods),1,2) AS int)*100+CAST(SUBSTR(COALESCE(gap.all_periods,fct.all_periods),4,2) AS int) AS all_periods_int
FROM temp_nielsen_gap_total_all_markets_raw gap
FULL OUTER JOIN(
SELECT
all_markets,
all_periods,
SUM(dollar) AS dollar
FROM temp_nielsen_sku_facts_all_markets_raw
GROUP BY all_markets,
all_periods
) fct
ON( gap.all_markets = fct.all_markets AND
gap.all_periods = fct.all_periods
)
WHERE ABS(NVL(gap.dollar,0) - NVL(fct.dollar,0)) > 1 AND
fct.all_markets in (SELECT DISTINCT all_markets FROM temp_nielsen_gap_total_all_markets_raw)) t_final;https://stackoverflow.com/questions/48798049
复制相似问题