【问题标题】:Replace duplicate values only in consecutive records with NULL [duplicate]仅用 NULL 替换连续记录中的重复值 [重复]
【发布时间】:2015-11-23 05:25:17
【问题描述】:

假设我有两张桌子
Tran (Tran_Id, Tran_Name) TFlag(Tran_Id, Flag)

我的查询结果是这样的:

TRAN_ID TRAN_NAME   FLAG    
-------------------------
101     Lend        A   
101     Lend        B   
101     Lend        C   
101     Lend        D   
102     Borrow      E   
101     Lend        F   
101     Lend        G   

我希望输出是这样的:

TRAN_ID TRAN_NAME   FLAG
-------------------------
101     Lend        A   
(null)  (null)      B   
(null)  (null)      C   
(null)  (null)      D   
102     Borrow      E   
101     Lend        F   
(null)  (null)      G   

【问题讨论】:

  • 到目前为止你做了什么?请只选择一个 RDBMS,它是 sql server 或 oracle。
  • 在甲骨文中。我知道为所有重复项替换 null 。但不适用于“仅连续记录”。

标签: sql oracle


【解决方案1】:

您可以使用分析 LAG() OVER()

SQL Fiddle 用于工作演示。

例如,

SQL> SELECT
  2    CASE
  3      WHEN lag(tran_id) over(order by NULL) = tran_id
  4      THEN NULL
  5      ELSE tran_id
  6    END tran_id,
  7    CASE
  8      WHEN lag(tran_name) over(order by NULL) = tran_name
  9      THEN NULL
 10      ELSE tran_name
 11    END tran_name,
 12    flag
 13  FROM t;

   TRAN_ID TRAN_N F
---------- ------ -
       101 Lend   A
                  B
                  C
                  D
       102 Borrow E
       101 Lend   F
                  G

7 rows selected.

【讨论】:

    【解决方案2】:

    在 SQL Server 和 Oracle 中都可以使用 LAG 分析函数。甲骨文:

    WITH data (tran_id, tran_name, flag) AS (
        SELECT  01,   'Lend', 'A' FROM DUAL UNION ALL
        SELECT 101,   'Lend', 'B' FROM DUAL UNION ALL
        SELECT 101,   'Lend', 'C' FROM DUAL UNION ALL
        SELECT 101,   'Lend', 'D' FROM DUAL UNION ALL
        SELECT 102, 'Borrow', 'E' FROM DUAL UNION ALL
        SELECT 101,   'Lend', 'F' FROM DUAL UNION ALL
        SELECT 101,   'Lend', 'G' FROM DUAL 
    )
    SELECT
        NVL2(keep, tran_id, null) tran_id,
        NVL2(keep, tran_name, null) tran_name,
        flag
    FROM (
        SELECT
            tran_id, tran_name, flag,
            CASE WHEN LAG(tran_id) OVER (ORDER BY flag) <> tran_id OR LAG(tran_name) OVER (ORDER BY flag) <> tran_name THEN 1 END keep
        FROM
            data)
    

    【讨论】:

    • 它工作正常。感谢你。但我还有另外一种情况。
    • IF 我的查询结果包含字段(domain_name、plan_name、Tran_id、Tranname、flag)每个域名称 plan_name 是通过加入域和计划表获得的,tran_id 通过加入计划和 tran 表获得,通过加入标志tran 和 Tflag 表...这里 Domain_name 和 Plan_name 仅连续重复。其中 tran_id, tran_name,flag 与表中的重复.. (以后可能会重复)现在我想要与上面相同的输出,但记录按 (domainname, planname, traname) 排序
    猜你喜欢
    • 2022-12-17
    • 2018-04-11
    • 2020-09-09
    • 1970-01-01
    • 2017-09-19
    • 2018-08-22
    • 1970-01-01
    • 2018-02-17
    • 2018-12-01
    相关资源
    最近更新 更多