SQL无公共ID时如何合并符合条件的连续两行数据
SQL实现方案
实现逻辑
直接基于表中已经存在的连续RowNum字段做自连接,关联条件为前一行的RowNum等于后一行RowNum减1,之后过滤符合「前一行Value首字符为2、后一行Value首字符为3」的行对,最后拼接字段返回即可。
通用SQL代码(适用于MySQL/PostgreSQL等支持CONCAT函数的数据库)
假设你的表名为data_records,代码如下:
SELECT CONCAT(a.RowNum, '-', b.RowNum) AS RowNums, CONCAT(a.Value, ', ', b.Value) AS `Values` FROM data_records a JOIN data_records b ON a.RowNum = b.RowNum - 1 WHERE -- 前一行Value以2开头,Value为数值类型时需要先转字符串 LEFT(CAST(a.Value AS CHAR), 1) = '2' -- 后一行Value以3开头 AND LEFT(CAST(b.Value AS CHAR), 1) = '3'
特殊场景适配
无现成RowNum字段的情况
如果原表没有提供连续排序的RowNum,可先通过窗口函数生成排序序号再处理:
WITH ordered_data AS ( SELECT -- 替换ORDER BY后面的字段为你表中用来确定记录顺序的字段 ROW_NUMBER() OVER (ORDER BY 排序字段) AS RowNum, Value FROM data_records ) SELECT CONCAT(a.RowNum, '-', b.RowNum) AS RowNums, CONCAT(a.Value, ', ', b.Value) AS `Values` FROM ordered_data a JOIN ordered_data b ON a.RowNum = b.RowNum - 1 WHERE LEFT(CAST(a.Value AS CHAR), 1) = '2' AND LEFT(CAST(b.Value AS CHAR), 1) = '3'
不同数据库的语法差异
- Oracle 字符串拼接可直接用
||运算符,示例:a.RowNum || '-' || b.RowNum - SQL Server 可使用
+做字符串拼接,示例:CAST(a.RowNum AS VARCHAR(10)) + '-' + CAST(b.RowNum AS VARCHAR(10))
内容的提问来源于stack exchange,提问作者MaP
相关产品推荐
相关产品推荐

