【问题标题】:SQL Query replace duplicates with NULL or empty string ORACLESQL Query 用 NULL 或空字符串 ORACLE 替换重复项
【发布时间】:2020-10-10 14:29:02
【问题描述】:

我正在使用 oracle SQL 并有这样一个重复行的表:

Month   Product

March   ENVOY & External Keyboard (22)
March   ENVOY & External Keyboard (22)
March   ENVOY & External Keyboard (22)
March   ENVOY & External Keyboard (22)
March   ENVOY & External Keyboard (22)
March   ENVOY & External Keyboard (22)
April   ENVOY & External Keyboard (22)
April   ENVOY & External Keyboard (22)
April   ENVOY & External Keyboard (22)
April   ENVOY & External Keyboard (22)
April   ENVOY & External Keyboard (22)

我需要把它改成这样:

Month   Product

March   ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
April   ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)
        ENVOY & External Keyboard (22)

我正在尝试使用 SELECT (case when row_number() over (partition by times.calendar_month_name order by (select NULL)) = 1 then times.calendar_month_name end) Month 但不工作...有什么想法吗?

【问题讨论】:

  • “不工作”是什么意思?你有错误吗?结果错误?

标签: sql oracle duplicates


【解决方案1】:

可以使用LAG()窗口函数:

select 
  nullif(Month, lag(Month) over (order by null)) Month,
  Product
from tablename

请参阅demo
结果:

> MONTH | PRODUCT                       
> :---- | :-----------------------------
> March | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
> April | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)
>       | ENVOY & External Keyboard (22)

【讨论】:

  • 有没有办法用空白代替null?
  • 对于 Oracel,null'' 是相同的,因此如果将 nulls 替换为 '',您将得到 nulls。您可以做的是将nulls 替换为' '(一个空格)。
  • 检查这个:dbfiddle.uk/…
  • 完美!谢谢!
【解决方案2】:

SQL*Plus 中的小菜一碟:

SQL> break on month
SQL>
SQL> select month, product from test order by month desc;

MONTH      PRODUCT
---------- ------------------------------
March      ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
April      ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)
           ENVOY & External Keyboard (22)

11 rows selected.

SQL>

【讨论】:

  • 如果你这样做了我很高兴:)
【解决方案3】:

这种类型的操作在应用程序级别上确实做得更好。可以使用row_number(),但需要注意:

select (case when seqnum = 1 then month end) as month, product
from (select t.*,
             row_number() over (partition by month order by month) as seqnum
      from t
     ) t
order by month, seqnum;

请注意,SQL 查询以不确定的 顺序返回结果。因此,您需要一个外部 order by 来保证排序(即“第一”行具有值)。因为您正在处理完全重复的内容,所以没有唯一的排序键,因此即使两次调用 row_number() 也可能产生不同的结果——因此使用了子查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多