这是一个开头
今天领导给了一个任务,数据库表里有人员的基本信息,以及每个人身上的标签,每个人有一个或多个标签,每个标签也有分类,一级分类、二级分类。本来在数据库里的结构是这样的:
姓名(name) | 标签(label) | 标签分类(label_type) |
---|---|---|
张三 | 标签a | 二级分类1 |
张三 | 标签a | 一级分类2 |
张三 | 标签b | 三级分类4 |
张三 | 标签b | 二级分类1 |
张三 | 标签b | 一级分类3 |
李四 | 标签c | 二级分类3 |
李四 | 标签c | 一级分类3 |
需要得到下面结构的结果
姓名(name) | 标签(label) | 标签分类(label_type) |
---|---|---|
张三 | 标签a | 二级分类1/一级分类2 |
张三 | 标签b | 三级分类4/二级分类1/一级分类3 |
李四 | 标签c | 二级分类3/一级分类3 |
于是开始写sql (这里用的postgresSQL)
select max(name) as name,max(label) as label,string_agg(label_type,’/’) from table group by name,label
执行后发现结果跟我想象的不一样,对两个字段用group by分组后,分组内label_type字段原本的顺序被打乱了,结果像这样
姓名(name) | 标签(label) | 标签分类(label_type) |
---|---|---|
张三 | 标签a | 一级分类2/二级分类1 |
张三 | 标签b | 二级分类1/三级分类4/一级分类3 |
李四 | 标签c | 二级分类3/一级分类3 |
导致拼接出来的字段分类级别顺序错乱了。
解决办法:
用姓名+标签拼接出来的新字段进行分组,sql如下:
select max(name) as name,max(label) as label,string_agg(label_type,’/’) from table group by contact_ws(name,label)
问题就解决啦!