[英]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.