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

SQLite按两列拼接分组同时将foo列相同值用户归入同一组实现方法

SQLite 跨字段传递分组实现方案

实现思路

你需要的分组逻辑属于连通分量匹配,存在两层传递规则:

  • 规则1:city+age相同的行默认属于同一组
  • 规则2:foo值相同的行属于同一组
  • 传递性:若A和B同组、B和C同组,则A和C自动同组
    普通窗口函数dense_rank无法直接处理这种跨维度的传递匹配,需要用递归CTE先计算所有连通的行集合,再生成组号。

完整SQL代码

WITH base AS (
    -- 预计算h = city + age 列
    SELECT *, city || age AS h FROM t
),
recursive_groups AS (
    -- 锚点:每行初始组根节点为自身id
    SELECT id AS root_id, id, h, foo FROM base
    UNION ALL
    -- 递归关联:满足h相同或foo相同的行合并到同一根节点
    SELECT r.root_id, b.id, b.h, b.foo
    FROM recursive_groups r
    JOIN base b 
        ON (r.h = b.h OR r.foo = b.foo) 
        AND b.id < r.root_id
)
-- 最终按根节点编号生成组号
SELECT 
    DENSE_RANK() OVER (ORDER BY MIN(root_id)) AS grpnum,
    name,
    id,
    city,
    age,
    foo
FROM base b
JOIN recursive_groups rg ON b.id = rg.id
GROUP BY b.id, name, city, age, foo
ORDER BY grpnum;

输出结果验证

和你给出的示例逻辑一致:

  • grpnum = 1:Alice、Bob、Jack、Simone
  • grpnum = 2:Eve

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:06:03