sql - 获取两个品牌之间共同的用户数量

标签 sql join hive count hiveql

我有一个表,其中包含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 行)

等等......

最佳答案

您可以交叉连接不同的品牌来生成所有可能的组合,然后再添加两个连接以带来相应的用户 - 最后,您可以聚合和计数:

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/

相关文章:

mysql - 获取 news_tags 和 users_tags 的交集查询速度慢

MySQL自连接引用另一个表

sql - Postgres :Get the latest record from a table

sql - 处理来自非常大的数据库表的数据的架构

sql - 数据库设计 : Stored Record Edit History (Temporal Data)

MySQL 错误 1064 和 1146

sql - 如何在 MySQL 中组合两个具有不同列的 SQL 查询而不组合其结果行

hive - 导出 Hive 查询结果

hive - 通过从 Hive 表中读取数据创建的 spark 数据帧的分区数

sql - 根据 Key 求平均值