为什么内连接会在其他列中创建新的不同值?

问题描述 投票:0回答:1

我使用 Hue 在 Hive 中进行 SQL 查询。当我在两个表之间使用内部联接时,其中一个表的列获得新的不同值,这些值在联接之前不在该列中。

我有表periods,其中包含列period_nameperiod_first_dt,表traffic,其中包含列period_first_dtproduct_idtraffic_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中以及如何解决这个问题?

sql hive inner-join hue
1个回答
0
投票

我完全不确定,但尝试将 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
;
© www.soinside.com 2019 - 2024. All rights reserved.