You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为表中双向匹配的列值对添加统一pair_id?

为双向匹配的数值对添加统一pair_id

表结构与数据

我有一个名为tt的表,包含a和b两列,列中存在可重复的值,数据如下:

[a] [b]
1   2
1   3
1   4
2   1
2   3
3   2
4   1
4   5
5   4
5   6

当前已实现的查询

我已掌握查询双向匹配值对的SQL语句:

SELECT t1.A, t1.B
    FROM tt AS t1
INNER JOIN tt AS t2
    ON t1.A = t2.B AND t1.B = t2.A

需求

需要为这些匹配的双向值对添加新列pair_id,使同一值对的行拥有相同的pair_id,期望效果如下:

[a] [b] [pair_id]
1   2   1
2   1   1
1   4   2
4   1   2
2   3   3
3   2   3
4   5   4
5   4   4

解决方案

可以通过统一双向值对的“基准标识”,再生成连续的pair_id,具体实现如下:

通用方案(支持多数数据库)

利用LEAST和GREATEST函数将双向值对转换为统一的有序组合,再用DENSE_RANK()生成id:

SELECT 
    t1.a, 
    t1.b,
    DENSE_RANK() OVER (ORDER BY LEAST(t1.a, t1.b), GREATEST(t1.a, t1.b)) AS pair_id
FROM tt AS t1
INNER JOIN tt AS t2
    ON t1.a = t2.b AND t1.b = t2.a
ORDER BY pair_id, t1.a;

说明

  • LEAST(t1.a, t1.b)取两列中的较小值,GREATEST(t1.a, t1.b)取较大值,这样(1,2)和(2,1)会被统一识别为同一个组合。
  • DENSE_RANK()会按统一组合的顺序生成连续的pair_id,确保同一双向对的行id一致。
  • 末尾的ORDER BY用于对齐示例中的输出顺序。

兼容旧版数据库方案(如SQL Server)

如果数据库不支持LEAST/GREATEST,可以用CASE语句替代:

SELECT 
    t1.a, 
    t1.b,
    DENSE_RANK() OVER (ORDER BY 
        CASE WHEN t1.a < t1.b THEN t1.a ELSE t1.b END,
        CASE WHEN t1.a > t1.b THEN t1.a ELSE t1.b END
    ) AS pair_id
FROM tt AS t1
INNER JOIN tt AS t2
    ON t1.a = t2.b AND t1.b = t2.a
ORDER BY pair_id, t1.a;

内容的提问来源于stack exchange,提问作者muted_buddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:12:12