HIve sql汇总后将缺失的行数设置为0

gblwokeq  于 2021-04-02  发布在  Hive
关注(0)|答案(1)|浏览(543)

我有一个产品和子产品的表格,看起来像这样,产品

  1. | backend | sub_product | product |
  2. |---------|-------------|---------|
  3. | conn_go | go_update | prod_go |
  4. | conn_go | go_delete | prod_go |
  5. | conn_go | go_edit | prod_go |
  6. | conn_rv | rv_update | prod_rv |
  7. | conn_mb | mb_update | prod_mb |
  8. | conn_mb | mb_delete | prod_mb |
  9. | conn_mb | mb_edit | prod_mb |
  10. | conn_pr | pr_update | prod_pr |
  11. | conn_pr | pr_edit | prod_pr |
  12. | conn_ct | pol_edit | null |
  13. ....

然后,我有这个使用表,它记录了一个用户使用每个子产品的次数。

  1. | backend | yyyy_mm_dd | sub_product | x_id | user_id | count |
  2. |---------|------------|-------------|------|---------|-------|
  3. | conn_go | 2020-12-15 | go_update | 10 | 3422 | 1 |
  4. | conn_go | 2020-12-15 | go_delete | 10 | 23445 | 2 |
  5. | conn_go | 2020-12-15 | go_edit | 10 | 2243 | 2 |
  6. | conn_rv | 2020-12-15 | rv_update | 10 | 245342 | 1 |
  7. | conn_mb | 2020-12-15 | mb_update | 11 | 5464 | 3 |
  8. | conn_mb | 2020-12-15 | mb_delete | 11 | 1424 | 2 |
  9. | conn_mb | 2020-12-15 | mb_edit | 11 | 21454 | 2 |
  10. | conn_pr | 2020-12-15 | pr_update | 12 | 224525 | 1 |
  11. | conn_pr | 2020-12-15 | pr_edit | 12 | 22424 | 1 |

我想统计使用过每个产品的不同的user_ids,另外,我想在usage表中没有记录的情况下,将每个x_id未使用的产品s设置为0。

  1. | x_id | product | usage |
  2. |------|---------|-------|
  3. | 10 | prod_go | 3 |
  4. | 10 | prod_rv | 1 |
  5. | 10 | prod_mb | 0 |
  6. | 10 | prop_pr | 0 |
  7. | 10 | null | 0 |
  8. | 11 | prod_go | 0 |
  9. | 11 | prod_rv | 0 |
  10. | 11 | prod_mb | 3 |
  11. | 11 | prop_pr | 0 |
  12. | 11 | null | 0 |
  13. | 12 | prod_go | 0 |
  14. | 12 | prod_rv | 0 |
  15. | 12 | prod_mb | 0 |
  16. | 12 | prop_pr | 1 |
  17. | 12 | null | 1 |

我知道我可以根据 "x_id "和 "product "聚合不同的用户,就像这样。

  1. select
  2. usage.x_id,
  3. p.product,
  4. count(distinct(usage.user_id)) as usage
  5. from(
  6. select
  7. yyyy_mm_dd,
  8. x_id,
  9. backend,
  10. sub_product,
  11. user_id,
  12. count
  13. from
  14. my_schema.usage_table
  15. where
  16. yyyy_mm_dd between '2018-11-06' and '2020-01-20'
  17. and x_id is not null
  18. ) usage
  19. inner join
  20. my_schema.products p
  21. on p.backend = usage.backend and p.sub_product = usage.sub_product
  22. group by
  23. 1,2

但我不知道如何将未使用的 "产品 "包括在内。

yrdbyhpb

yrdbyhpb1#

使用LEFT JOIN

  1. select ut.x_id, p.product,
  2. count(distinct ut.user_id) as usage
  3. from my_schema.products p left join
  4. my_schema.usage_table ut
  5. on p.backend = ut.backend and
  6. p.sub_product = ut.sub_product and
  7. ut.yyyy_mm_dd between '2018-11-06' and '2020-01-20' and
  8. ut.x_id is not null
  9. group by 1, 2;

我还简化了查询,所以它不需要子查询。

相关问题