编写SQL语句实现反向记录的ID求和需求
SQL查询:对col1与col2互为反向的记录ID求和
需求
编写SQL查询,当my_table中存在col1与col2互为反向的记录时,对这些记录的ID求和。
原表数据
| id | col1 | col2 |
|---|---|---|
| 1 | a | b |
| 2 | b | a |
| 3 | b | a |
| 4 | c | d |
| 5 | d | c |
| 6 | x | y |
预期输出
| id | col1 | col2 |
|---|---|---|
| 6 | a | b |
| 9 | c | d |
| 6 | x | y |
逻辑说明
只要存在col1和col2互为反向的记录(即一条记录的col1等于另一条的col2,且col2等于另一条的col1),就将所有这类记录的ID相加;无反向记录的条目,直接保留其ID。
正确SQL语句
原参考SQL使用REVERSE()函数的逻辑有误(该函数用于字符串反转,而非列值互换匹配),且无法处理多条反向记录的求和,以下是能得到预期结果的查询:
SELECT SUM(id) AS id, -- 统一显示顺序为较小值在前,匹配预期输出格式 LEAST(col1, col2) AS col1, GREATEST(col1, col2) AS col2 FROM my_table GROUP BY LEAST(col1, col2), GREATEST(col1, col2) ORDER BY id;
原参考SQL问题说明
原参考SQL仅能两两匹配ID较小和较大的记录,无法将所有互为反向的记录归为一组求和(比如id=1、2、3的a-b/b-a记录,原查询会生成多条部分求和结果,而非总和6),且REVERSE()函数在此场景下属于误用,正确的分组方式是通过LEAST()和GREATEST()将互为反向的记录归为同一组。
内容的提问来源于stack exchange,提问作者APRAJIT SHARMA
相关产品推荐
相关产品推荐

