sql—为什么除了一个字段外,所有字段上的完全联接都会在该字段上返回空值?

vnzz0bqm  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(289)

我正在研究使用完全联接的两个不同select语句中的用户id的重叠和不重叠(唯一值)。主要区别在于一个表的deal\u id=0,而另一个表的deal\u id大于或等于1。我加入了exchange\u id、pub\u id和user\u id上的select语句,但没有加入deal\u id上的select语句。下面是我的查询:

SET
hive.auto.convert.join = TRUE
;

SELECT
    First.deal_id
    ,COALESCE( First.exchange_id, Second.exchange_id ) as exchange_id
    ,COALESCE( First.pub_id, Second.pub_id ) as pub_id
    ,COUNT (DISTINCT(case when Second.user_id is null then First.user_id else null END)) AS Incremental
    ,SUM (First.imps) AS First_imps
    ,SUM (Second.imps) AS Second_imps
    FROM
        (
            SELECT
                a.deal_id
                ,a.exchange_id
                ,a.pub_id
                ,a.user_id
                ,1 AS imps
            FROM
                logs a 
            WHERE
                a.deal_id >= 1
            AND a.event_type = 'TRUE'
        ) First 
        FULL JOIN (
            SELECT
                a.exchange_id
                ,a.pub_id
                ,a.user_id
                ,1 AS imps
            FROM
                logs a
            WHERE
            a.deal_id = 0
            AND a.event_type = 'TRUE'
        ) Second
        ON (
            First.exchange_id = Second.exchange_id
            AND First.pub_id = Second.pub_id
            AND First.user_id = Second.user_id
        )
        GROUP BY
        COALESCE( First.exchange_id, Second.exchange_id )
        ,COALESCE( First.pub_id, Second.pub_id )
;

以下是我看到的结果:

DEAL_ID    EXCHANGE_ID    PUB_ID    INCREMENTAL    FIRST_IMPS    SECOND_IMPS
/N         4              1780      0              0             15
/N         4              1560      0              0             32
3389       4              1780      2              7             6
1534       4              1560      4              9             8

下面是我想看到的:

DEAL_ID    EXCHANGE_ID    PUB_ID    INCREMENTAL    FIRST_IMPS    SECOND_IMPS
3389       4              1780      2              7             21
1534       4              1560      4              9             40

其中,基于exchange\u id和pub\u id,具有空交易id的结果与具有非空交易id的结果匹配。
我能做什么?
编辑:为了澄清-我输入的查询是对原始查询的简化,它需要两个单独的select语句,因为我正在与另一个events表进行联合。我没有在这里显示它,因为它与完全连接问题上的聚合无关。另外,增量值试图计算存在于deal\u id>=1中而不存在于deal\u id=0中的用户(完全联接的另一个原因)。

kiayqfof

kiayqfof1#

你的问题似乎太复杂了。您可以对查询使用条件聚合:

select min(case when l.deal_id >= 1 then l.deal_id end) as deal_id,
       l.exchange_id, l.pub_id,
       count(distinct case when l.deal_id >= 1 then l.user_id end) as incremental,
       sum(case when l.deal_id >= 1 then 1 else 0 end) as imps_1,
       sum(case when l.deal_id = 0 then 1 else 0 end) as imps_0
from logs l
where l.event_type = 'TRUE'
group by l.exchange_id, l.pub_id;

我唯一不确定的专栏是 deal_id . 但这似乎是你想要的逻辑。

相关问题