繁体   English   中英

SQL 查询用 NULL 或空字符串 ORACLE 替换重复项

[英]SQL Query replace duplicates with NULL or empty string ORACLE

我正在使用 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但不工作......有什么想法吗?

您可以使用LAG() window function:

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

演示
结果:

> 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)

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>

这种类型的操作在应用程序级别上确实做得更好。 您可以使用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()也可能产生不同的结果——因此使用子查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM