我使用 Hue 在 Hive 中进行 SQL 查询。当我在两个表之间使用内部联接时,其中一个表的列获得新的不同值,这些值在联接之前不在该列中。
我有表periods,其中包含列period_name和period_first_dt,表traffic,其中包含列period_first_dt、product_id和traffic_sum。有关下表的详细信息:
表期间
专栏 | 数据类型 | 价值示例 |
---|---|---|
期间名称 | 绳子 | 12 月 23 日 |
period_first_dt | 日期时间 | 2023-12-01 00:00:00 |
表交通
专栏 | 数据类型 | 价值示例 |
---|---|---|
period_first_dt | 绳子 | 2018-01-01T00:00:00Z |
产品_id | bigint | 135 |
traffic_sum | bigint | 123123 |
我想在 traffic 表中有 period_name 并通过 period_name 计算 traffic_sum 的总和。我像这样内部连接两个表:
with periods as (
select
period_name,
cast(period_first_dt as date) as period_first_dt
from
periods
where 1=1
and period_name in ('NOV-23', 'DEC-23')
)
select
p.period_name,
sum(t.traffic_sum) as traffic_sum
from
traffic t
join
periods p on p.period_first_dt = cast(substring(t.period_first_dt, 1, 10) as date)
where 1=1
and t.product_id = 135
group by
p.period_name
;
CTE periods 具有以下值:
期间名称 | period_first_dt |
---|---|
12 月 23 日 | 2023-12-01 |
23 年 11 月 | 2023-11-01 |
上面的查询有以下结果:
期间名称 | traffic_sum |
---|---|
2023-11-01 | 1894758884807.576 |
2023-12-01 | 1953671751139.3423 |
12 月 23 日 | 132211702997.26137 |
23 年 11 月 | 90683990757.3648 |
列 period_name 以某种方式具有内部联接之前不存在的新值:
2023-11-01
和 2023-12-01
。当我将 CTE and period_name in ('NOV-23', 'DEC-23')
中的条件更改为 and period_name = 'DEC-23'
时,结果在 period_name 中没有新值:
期间名称 | traffic_sum |
---|---|
12 月 23 日 | 2085883454136.6035 |
当我删除条件
and t.product_id = 135
并将条件保留在 CTE and period_name in ('NOV-23', 'DEC-23')
中时,结果在 period_name 中没有新值:
期间名称 | traffic_sum |
---|---|
12 月 23 日 | 2658701852149.3955 |
23 年 11 月 | 2518165900926.1953 |
为什么新的不同值出现在period_name中以及如何解决这个问题?
我完全不确定,但尝试将 period 重命名为 periodx。 在您的主要选择语句中,我不确定它会获取您的“数据为”表还是实际的表周期。如果这有道理吗?
with **periodsx** as (
select
period_name,
cast(period_first_dt as date) as period_first_dt
from
periods --do not change here
where 1=1
and period_name in ('NOV-23', 'DEC-23')
)
select
p.period_name,
sum(t.traffic_sum) as traffic_sum
from
traffic t
join
**periodsx** p on p.period_first_dt = cast(substring(t.period_first_dt, 1, 10) as date)
where 1=1
and t.product_id = 135
group by
p.period_name
;