【问题标题】:Get count of users common between two brands获取两个品牌之间共有的用户数
【发布时间】:2020-06-08 20:18:58
【问题描述】:

我有一个包含branduid 列的表。当特定用户与品牌进行交易时,它会捕获信息。表格示例如下

+-------+-----+
| brand | uid |
+-------+-----+
| A     | 111 |
| B     | 111 |
| C     | 111 |
| A     | 112 |
| B     | 112 |
| D     | 112 |
| A     | 114 |
| B     | 114 |
| C     | 114 |
| B     | 115 |
| C     | 115 |
| A     | 116 |
| D     | 116 |
+-------+-----+

我想要两个品牌之间共有的用户数。例如,如果一个用户与品牌 A 进行交易,那么他们中有多少人与品牌 B 进行交易等等(所有可能的组合)

想要的输出如下

+--------+--------+------------+
| brand1 | brand2 | count_user |
+--------+--------+------------+
| A      | A      |          4 |
| A      | B      |          3 |
| A      | C      |          2 |
| A      | D      |          2 |
| B      | A      |          3 |
| B      | B      |          4 |
| B      | C      |          3 |
| B      | D      |          1 |
| C      | A      |          2 |
| C      | B      |          3 |
| C      | C      |          3 |
| C      | D      |          0 |
| D      | A      |          2 |
| D      | B      |          1 |
| D      | C      |          0 |
| D      | D      |          2 |
+--------+--------+------------+

输出应如下所示

  1. 有 4 位用户与品牌 A 进行过交易(第 1 行)
  2. 有 3 位用户曾与品牌 A 和 B 进行过交易(第 2 行)
  3. 有 2 位用户曾与品牌 A 和 c 进行过交易(第 3 行)

等等........

【问题讨论】:

  • 你真的需要两个品牌的两行,即A,B,3B,A,3吗?这个结果是相当昂贵的,如果你能减少结果行的数量应该会更快

标签: sql join hive count hiveql


【解决方案1】:

你可以cross joindistinctbrands来生成所有可能的组合,然后再添加两个join来带来对应的用户——最后可以聚合统计:

select b1.brand brand1, b2.brand brand2, count(t2.uid) count_users
from (select distinct brand from mytable) b1
cross join (select distinct brand from mytable) b2 
inner join mytable t1 
    on  t1.brand = b1.brand 
left  join mytable t2 
    on  t2.brand = b2.brand
    and t2.uid = t1.uid 
group by b1.brand, b2.brand
order by b1.brand, b2.brand

Demo on DB Fiddle

品牌1 |品牌2 | (无列名) :----- | :----- | ---------------: 一个 |一个 | 4 一个 |乙| 3 一个 | C | 2 一个 | D | 2 乙|一个 | 3 乙|乙| 4 乙| C | 3 乙| D | 1 C |一个 | 2 C |乙| 3 C | C | 3 C | D | 0 D |一个 | 2 D |乙| 1 D | C | 0 D | D | 2

这不是 Hive 小提琴(没有可用的),但语法是标准的,在 Hive 中也可以正常工作。

【讨论】:

  • cross join之后是什么原因inner join:inner join mytable t1 on t1.brand = b1.brand?
猜你喜欢
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多