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

在SQL中为#test表按联系人规则创建条件列Result

为#test表添加Result列的解决方案

针对你的需求,我们可以通过SQL窗口函数实现按联系人分组标记指定行的逻辑,核心思路是利用ROW_NUMBER()判断分组内首行、LAG()获取前一行的Resolved值,结合CASE语句生成Result列。

核心逻辑说明

需要标记的两类行:

  • 每个联系人的第一行且Resolved=0
  • 每个联系人中前一行Resolved=1,当前行Resolved=0(自动覆盖“1之后出现的第一个0”的需求,后续连续0的前一行是0,不会触发该条件)

代码实现

1. 查询时生成Result列(临时查看)

SELECT 
    -- 替换为你的实际列名:联系人列、其他原有列
    ContactID,
    Column1,
    Column2,
    Resolved,
    CASE 
        -- 条件1:分组内第一行且Resolved=0
        WHEN ROW_NUMBER() OVER (PARTITION BY ContactID ORDER BY [排序列]) = 1 AND Resolved = 0 THEN 1
        -- 条件2:前一行是1,当前行是0
        WHEN LAG(Resolved) OVER (PARTITION BY ContactID ORDER BY [排序列]) = 1 AND Resolved = 0 THEN 1
        ELSE 0
    END AS Result
FROM #test;

2. 永久添加Result列到表中(以SQL Server为例)

如果需要将Result列持久化到表中,由于部分SQL版本不支持计算列使用窗口函数,可采用先加列再更新的方式:

-- 第一步:添加Result空列
ALTER TABLE #test ADD Result INT;

-- 第二步:通过CTE更新Result值
WITH ContactRows AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY ContactID ORDER BY [排序列]) AS row_num,
        LAG(Resolved) OVER (PARTITION BY ContactID ORDER BY [排序列]) AS prev_resolved
    FROM #test
)
UPDATE ContactRows
SET Result = CASE 
                WHEN row_num = 1 AND Resolved = 0 THEN 1
                WHEN prev_resolved = 1 AND Resolved = 0 THEN 1
                ELSE 0
             END;

注意事项

  • 必须替换代码中的[排序列]为表中能确定行顺序的字段(比如时间戳、自增ID等),因为“第一个”“后续出现”的逻辑依赖行的顺序,需与示例图中的行顺序对应。
  • 若使用其他SQL方言(如MySQL、PostgreSQL),语法细节可能略有差异,但核心窗口函数的逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:40:59