ClickHouse-SQL练习一

一、需求

表一经过sql语句输出为表二

-- 表一:
─uid─┬─gender─┬─agegroup─┬─favor─┐
│   1 │ M      │ 90后     │ sm    │
│   2 │ M      │ 70后     │ sj    │
│   3 │ M      │ 90后     │ ms    │
│   4 │ F      │ 80后     │ sj    │
│   5 │ F      │ 90后     │ ms    │
└─────┴────────┴──────────┴───────┘

-- 表二:
┌─tag──────┬─tag_value─┬─uid─────┐
│ agegroup │ 70后      │ [2]     │
│ agegroup │ 80后      │ [4]     │
│ agegroup │ 90后      │ [1,3,5] │
│ favor    │ ms        │ [3,5]   │
│ favor    │ sj        │ [2,4]   │
│ favor    │ sm        │ [1]     │
│ gender   │ F         │ [4,5]   │
│ gender   │ M         │ [1,2,3] │
└──────────┴───────────┴─────────┘

二、分析

表一到表二是一眼看不出来的,可以一步一步来,用反推来

1、uid展开(列转行)

列转行:将一列中复杂的array或者map结构拆分成多行

把表二的uid展开如下

标签 标签值 用户
年龄段 90后 1
年龄段 90后 3
年龄段 90后 5
年龄段 80后 4
年龄段 70后 2
性别 1
性别 2
性别 3
性别 4
性别 5
偏好 数码 1
偏好 美食 3
偏好 美食 5
偏好 书籍 2
偏好 书籍 4

排序看起来可能更好理解

标签 标签值 用户
年龄段 90后 1
性别 1
偏好 数码 1
年龄段 70后 2
性别 2
偏好 书籍 2
年龄段 90后 3
性别 3
偏好 美食 3
年龄段 80后 4
性别 4
偏好 书籍 4
年龄段 90后 5
性别 5
偏好 美食 5

2、聚合

统计每个uid,聚合起来如下

用户 标签值
1 [(年龄段,90后),(性别,男),(偏好,数码)]
2 [(年龄段,70后),(性别,男),(偏好,书籍)]
3 [(年龄段,90后),(性别,男),(偏好,美食)]
4 [(年龄段,80后),(性别,女),(偏好,书籍)]
5 [(年龄段,90后),(性别,女),(偏好,美食)]

三、结果步骤

1、查询

查询出数据

select
agegroup,
gender,
favor,
uid
from user_tag_merge
;

┌─agegroup─┬─gender─┬─favor─┬─uid─┐
│ 90后     │ M      │ sm    │   1 │
│ 70后     │ M      │ sj    │   2 │
│ 90后     │ M      │ ms    │   3 │
│ 80后     │ F      │ sj    │   4 │
│ 90后     │ F      │ ms    │   5 │
└──────────┴────────┴───────┴─────┘

2、组合成元组

每个值前面,补上字段名,用**()组合成元组**

select
('agegroup', agegroup )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值