如何解决如果所选列 postgresql sql 的列中的数据相同,则为空行值
我有一张这样的桌子:
cms_code | product
------------+---------
55381XA384 | MS
55381XA384 | MS
55381XA384 | HSD
55381XA384 | HSD
55381XA382 | HSD
55381XA382 | XP
55381XA382 | MS
55381XA382 | HSD
55381XA382 | HSD
现在,我需要这样的结果:
cms_code | product
------------+---------
55381XA384 | MS
NULL | MS
NULL | HSD
NULL | HSD
55381XA382 | HSD
NULL | XP
NULL | MS
NULL | HSD
NULL | HSD
解决方法
您可以使用窗口函数对行进行编号并将后续值设置为 null
,仅保留第 1 行的 cms_code
。
select
case
when row_number() over (partition by cms_code) = 1 then cms_code
else null
end cms_code,product_code
from my_table
order by cms_code
,
您的结果取决于行的顺序。 SQL 表代表无序集,因此您无法对现有数据做任何想做的事情。
假设您有一列指定排序,您可以这样做:
select (case when row_number() over (partition by cms_code order by <ordering col< = 1
then cms_code
end) as cms_code,product_code
from t
order by cms_code,<ordering col>;
没有排序列,你也可以这样做:
with cte as (
select t.*,row_number() over (partition by cms_code order by cms_code) as seqnum
from t
)
select (case when seqnum = 1 then cms_code end) as cms_code,seqnum;
在这两种情况下,您都需要外部查询中的 order by
来保证结果集是有序的,因此“第一”行具有 cms_code
。
我假设您希望在第一个值之后相同的 cms_code 的所有值都为 null。如果我错了,请纠正我以下查询可用于相同的:
SELECT
CASE
WHEN ROW_NUMBER() OVER(PARTITION BY cms_code order by product) = 1
THEN NULL
ELSE cms_code
END AS cms_code,product
FROM table;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。