【问题标题】:how to avoid duplicates in hive query如何避免配置单元查询中的重复
【发布时间】:2021-03-31 03:32:47
【问题描述】:

我有两张桌子:

table1

the_date | my_id |

02/03/2021,123
02/03/2021, 1234
02/03/2021, 12345

table2

the_date | my_id |seq | txt
02/03/2021, 1234, 1 , 'OK'
02/03/2021, 12345, 1, 'OK'
02/03/2021, 12345, 2, 'HELLO HI THERE'
02/03/2021, 123456, 1, 'Ok'

这是我的代码:

WITH AB AS (
SELECT  A1.my_id
FROM DB1.table1 A1 , DB1.MSG_REC A2  WHERE
A1.my_id=A2.my_id
),
BC AS (
SELECT  AB.the_date
COUNT ( DISTINCT (CASE WHEN (TXT like '%OK%') THEN AB.my_id ELSE NULL END )) AS
CASE1 ,
COUNT ( DISTINCT (CASE WHEN (TXT like '%HELLO HI THERE%') THEN AB.my_id ELSE NULL END )) AS
CASE2
FROM AB left JOIN DB1.my_id BC ON AB.my_id =BC.my_id

源于上面的问题是我在值“12345”上循环了两次,因为它满足两个 case 语句。

这会在捕获计数指标时导致数据重复。有没有办法执行第一种情况,然后执行第二种情况,但排除从第一种情况循环任何“my_id”记录。

例如,当需要运行上述脚本并执行第一个案例时,它将获取以下记录并且计数为 3

 02/03/2021, 1234, 1 , 'OK'
  02/03/2021, 12345, 1, 'OK'
 02/03/2021, 123456, 1, 'Ok

第二种情况应该只循环下面的记录,计数只有 1

 02/03/2021, 12345, 2, 'HELLO HI THERE'

如果我不创造条件来规避这个问题,CASE1 将是 4,CASE2 会是 2。有什么提示或建议吗?

【问题讨论】:

  • 此查询需要一些工作 - 1) 列“the_date”在公用表表达式 (cte) AB 中不合格,2) cte BC 需要幻列 the_date 上的“group by”子句(参见1) - 3) cte BC 需要关闭 - 4) 语句需要以 select * from BC 5) 在 cte AB 中 - “table2”是否意味着 MSG_REC ?

标签: sql hive case hiveql


【解决方案1】:

在 DISTINCT 聚合之前为您的每个 ID 分配大小写。之后进行不同的聚合,这样您将消除在不同情况下计数的相同 ID。见代码中的cmets:

select --do final distinct aggregation
      count(distinct (case when assigned_case='CASE1' then my_id else null end ) ) as CASE1,
      count(distinct (case when assigned_case='CASE2' then my_id else null end ) ) as CASE2
from 
(
select my_id
       --assign single CASE to all rows with the same id based on some logic:
        case when case1_flag = 1 then 'CASE1' 
            when case1_flag = 1 then 'CASE2'
           else NULL
        end as assigned_case
from
(--calculate all CASE flags for each ID 
select AB.my_id, 
       max(CASE WHEN (TXT like '%OK%') THEN 1 ELSE NULL END)  over (partition by AB.my_id) as case1_flag
       max(CASE WHEN (TXT like '%HELLO HI THERE%') THEN 1 ELSE NULL END)  over (partition by AB.my_id) as case2_flag
from ...
) s
) s

【讨论】:

    猜你喜欢
    • 2016-06-28
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多