我有一个表,其中包含brand
和uid
列。当特定用户与品牌进行交易时,它会捕获信息。表格示例如下
+-------+-----+
| 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 |
+--------+--------+------------+
输出应如下所示
- 有 4 位用户与品牌 A 进行过交易(第 1 行)
- 有 3 位用户与品牌 A 和 B 进行过交易(第 2 行)
- 有 2 位用户与品牌 A 和 c 进行过交易(第 3 行)
等等......
最佳答案
您可以交叉连接
不同的品牌来生成所有可能的组合,然后再添加两个连接以带来相应的用户 - 最后,您可以聚合和计数:
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 :
brand1 | brand2 | (No column name) :----- | :----- | ---------------: 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
这不是 Hive fiddle (没有可用的),但语法是标准的,并且在 Hive 中也能正常工作。
关于sql - 获取两个品牌之间共同的用户数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62270549/