如何解决SQL:将每组N行合并为一行
我有这个
ID | Name | Age | Number | Date of Registration
------------------------------------------------
1 | Peter| 23 | 472845 | 20190826
2 | Mary | 16 | 543342 | 20200310
3 | Li | 53 | 328712 | 20171124
4 | Eric | 8 | 798072 | 20181222
5 | Dan | 27 | 909123 | 20200101
我想将N行的组连接成一行。对于N = 2,这可以给我这个
1,Peter,23,472845,20190826 | 2,Mary,16,543342,20200310
3,Li,53,328712,20171124 |4,Eric,8,798072,20181222
5,Dan,27,909123,20200101
如果可能,我想保留记录分割器|两行之间,以备后用,但可以用逗号替换。以后的用法与查询本身无关,因此此处不予讨论,但可以作为诸如更新成员信息之类的用例。用作记录拆分器,如果|不可用,我也可以使用正则表达式定义记录。
我尝试了ststst(),但是如果N = 100怎么办?有谁有更好的主意?也许group_concat?
谢谢!
解决方法
您可以使用聚合:
select group_concat(
concat_ws(',',id,name,age,number,date_of_registration)
order by id
separator ' | '
) val
from mytable
group by floor((id - 1) / 2)
您可以使用group by
子句(当前为2
)中的分母来控制每组的行数。
这假设id
从1
开始并递增且没有间隔。否则,我们可以使用row_number()
生成自己的序列:
select group_concat(
concat_ws(',date_of_registration)
order by id
separator ' | '
) val
from (select t.*,row_number() over(order by id) rn mytable) t
group by floor((rn - 1) / 2)
concat_ws()
强制转换为字符串,并跳过null
值。如果要在结果集中表示这些null
值,则需要在每个可为空的列周围使用colaesce()
,例如:
concat_ws(',coalesce(name,''),date_of_registration)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。