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

Oracle去除连续重复数据求助:筛选CUSTOMER_EVAL_RESULTS特定行

解决方法:保留客户评估结果变化的记录

看起来你想要保留的是客户评估结果发生变化的记录——也就是每次RESULT和上一条记录不同的行,再加上分组里的第一条记录对吧?从你的示例数据来看,SEQ3的RESULT和SEQ1一致(都是XYZ),SEQ12的RESULT和SEQ11一致(都是ABC),所以这两行需要排除,剩下的就是你要的1、7、8、11。

你之前用ROW_NUMBER()的思路没生效,是因为按CUSTOMER_ID, STATUS分区只会给每个分组的行编序号,没法识别RESULT的变化。这里我们需要用LAG()窗口函数来跟踪上一行的RESULT值,再做对比过滤。

具体SQL实现

SELECT SEQ, CUSTOMER_ID, STATUS, RESULT
FROM (
    SELECT 
        SEQ,
        CUSTOMER_ID,
        STATUS,
        RESULT,
        -- 获取同一客户、同一状态下,上一条记录的RESULT值
        LAG(RESULT) OVER(PARTITION BY CUSTOMER_ID, STATUS ORDER BY SEQ) AS PREV_RESULT
    FROM CUSTOMER_EVAL_RESULTS
) filtered_results
-- 保留第一行,或者当前RESULT和上一行不同的行
WHERE PREV_RESULT IS NULL OR RESULT != PREV_RESULT;

代码解释

  1. 内层查询:用LAG(RESULT) OVER(...)按CUSTOMER_ID和STATUS分组,再按SEQ升序排序,获取当前行的上一行RESULT值,命名为PREV_RESULT。
  2. 外层过滤:
    • PREV_RESULT IS NULL:匹配分组里的第一条记录(没有上一行,所以PREV_RESULT为空),必须保留。
    • RESULT != PREV_RESULT:匹配当前行RESULT和上一行不同的记录,也就是结果发生变化的行,需要保留。

测试你的示例数据

把你的示例数据代入这个查询,会得到以下结果:

SEQCUSTOMER_IDSTATUSRESULT
1100CXYZ
7100CABC
8100CPQR
11100CABC

完全符合你想要的结果!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:12:10