小白之前经常在工作中遇到需要行转列的情况,这次就总结一下,之前遇到过的各种情况,及在各种情况下的函数应用。
场景:
现有一个表,表示一个房型在未来60天的是否可订情况,由于房型的数据量是庞大的,可能达到几十亿,那么在展示时,就需要把可订酒店的可订天数展示为一个字段,这样就会缩小整个表的行数。
id | isbook | time |
---|---|---|
698570 | 0 | 2019-07-11 |
698570 | 0 | 2019-07-12 |
698570 | 0 | 2019-07-13 |
698570 | 0 | 2019-07-14 |
698570 | 0 | 2019-07-15 |
698570 | 0 | 2019-07-16 |
698570 | 0 | 2019-07-17 |
698570 | 0 | 2019-07-18 |
698570 | 0 | 2019-07-19 |
698570 | 0 | 2019-07-20 |
将这样的数据变为一行展示,就使用到之前博文中讲到的concat_ws函数,具体使用可以参考之前博文(https://blog.csdn.net/Jarry_cm/article/details/86995580),这个函数与collect_set或者collect_list匹配使用可以达到不同的效果。collect_set函数是对统计的数据进行去重,然后拼接在一起,collect_list是不去重,直接所有出现的值进行拼接。
语法如下,以collect_list为例:
select id,
isbook,
concat_ws (',', collect_list(time)) as effectdateList
from table
group by id,isbook
结果为(因为本数据中没有重复的日期,所以是所有日期的拼接结果,两个函数一样,有重复的日期时,函数的区别就体现出来了,这里就不另外在举例):
id | isbook | effectdateList |
---|---|---|
698570 | 0 | 2019-07-18,2019-07-13,2019-07-14,2019-07-11,2019-07-16,2019-07-15,2019-07-17,2019-07-20,2019-07-12,2019-07-19 |