添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
SQL的多行合并与拆分

SQL的多行合并与拆分

1.多行合并为一行

1.1.Hive-SQL:collect_set和collect_list

假设有表格t,表示学生迟到信息

date name
20220822 张三
20220823 张三
20220810 李四
20220811 李四

用列转行在1行查看学生的所有迟到信息

select
    t.name,
    concat_ws(",",collect_set(date)) as date_detail_set,
    concat_ws(",",collect_list(date)) as date_detail_list
from t 
group by
    t.name
;
输出结果
name date_detail_set date_detail_list
张三 20220823,20220822 20220823,20220822
李四 20220810,20220811 20220810,20220811

输出结果有序展示

先对数据排序,用collect_list对排序后的结果进行转化,代码如下

select
    t1.name,
    concat_ws(",",collect_set(date)) as date_detail_set,
    concat_ws(",",collect_list(date)) as date_detail_list
(select *
from t 
order by
     name,date) t1
group by
    t1.name
;
输出结果
name date_detail_set date_detail_list
张三 20220823,20220822 20220822,20220823
李四 20220810,20220811 20220810,20220811

1.2.PostgreSQL:string_agg()

-- 模板:string_agg(字段 order by 排序字段)
-- 测试数据准备
create table tmp_0824 as 
select '20220822' as date,'张三' as name 
union all select '20220823' as date,'张三' as name 
union all select '20220810' as date,'李四' as name 
union all select '20220811' as date,'李四' as name 
-- 多行合并为一行
select 
	,string_agg(date||';'  )  as date_set
	,string_agg(date||';' order by date )  as date_list 
from tmp_0824
group by 
;

2.一行拆分为多行

2.1.Hive-SQL:LATERAL VIEW explode

假设有表t1,表样如上述输出结果,现在需要将其展开为表t
函数:LATERAL VIEW explode,代码如下

select 
	name,
	date_detail_set,
from t  
where LATERAL VIEW explode(split(date_detail_set,",")) result as date
group by name,date_detail,date
;

2.2.PostgreSQL:unnest(),string_to_array()组合

-- 由于数据源末位有“,”,所以拆分后有空的行,需要限制下;一般正常情况不需要删除
-- 模板:unnest(string_to_array(需要拆分的字段, '拆分符号')) as date 
-- 案例:
select 
(select 
	,date_set