如何检查oracle中列的所有值是不是相同
Posted
技术标签:
【中文标题】如何检查oracle中列的所有值是不是相同【英文标题】:How to check if all values of column are same in oracle如何检查oracle中列的所有值是否相同 【发布时间】:2021-09-11 01:58:27 【问题描述】:我有一个源表(Oracle DB),其中包含以下示例数据,我想从中检查特定列(col3)的值是否与 column1 相同。如果是这样,则将新字段填充为“Y”否则为“N”。
Sample source table
SRC_TABLE
col1 col2 col3 col4 col5 ....colx
----- --------- ------ ---- ----- --------
ID001 SUPLIER_1 121.00 abc 123 ...
ID001 SUPLIER_2 100 abc 123 ...
ID001 SUPLIER_3 201.12 abc 123 ...
ID002 SUPLIER_1 150.00 abc 123 ...
ID002 SUPLIER_3 150 abc 123 ...
从上表中,我想检查给定 col1 组的 col3 是否相同,如果它们相同,则填充为“Y”,否则为“N”,如下面的 New_Field 列所示。
col1 col2 col3 col4 col5 ....colx New_Field
----- --------- ------ ---- ----- -------- ---------
ID001 SUPLIER_1 121.00 abc 123 ... N
ID001 SUPLIER_2 100 abc 123 ... N
ID001 SUPLIER_3 201.12 abc 123 ... N
ID002 SUPLIER_1 150.00 abc 123 ... Y
ID002 SUPLIER_3 150 abc 123 ... Y
我无权在源中操作更改,我想根据源数据得出计算并加载到目标中。我尝试使用 group by 同时从源中获取数据以及 select 语句,但由于不是 group by 表达式而出现错误。非常感谢任何有助于实现所需输出的帮助。谢谢!
select
col1,
col2,
col3,
col4,
.
.
.
.
colx,
case when count(distinct col3) > 1 then 'N' else 'Y' end as new_field
from src_table
group by col1,col2,col4,col5...colx
在 group by 子句中添加 new_field 会返回无效标识符错误,如果我通过得到 not a group by expression 错误将其从组中删除,如上所示。不知道如何得到想要的结果。
【问题讨论】:
您需要在 Group by 中添加 col3 而不是 new_field。 【参考方案1】:我想你想要一个窗口函数。
select
src_table.*,
case when count(*) over (partition by col1, col3) = 1 then 'N' else 'Y' end as new_field
from src_table
在这种情况下,窗口分区是您希望唯一的值(col1 和 col3),因此该窗口上的 count(*)
将返回您在表中的重复行数(对于特定的 col1+ col3 组合)。
我注意到你有 150
和 150.00
作为值,所以你可能需要做 (partition by col1, to_number(col3))
【讨论】:
谢谢@kfinity...但是似乎这并没有给出期望的结果,因为分区已被用于 col1 & col3 这导致例如如果 col1 具有相同的值而 col3 具有不同的值,例如在col1 as ID003 and col3 as 100,100,120
下方,它给了我 col3 120 条目的 Y 和 col3 100 的其余条目的 N。只需使用以下 sn-p 即可获得@syan @syan case when count(distinct col3) over (partition by col1) = 1 then 'Y' else 'N' end
建议的所需结果【参考方案2】:
正如上面@kfinity所说,你真的可以使用解析窗口函数count()over
得到它,但是使用count(distinct col3) over(partition by col1)
而不是count(*) over(partition by col1,col3)
:
select
s.*
,case count(distinct col3)over(partition by col1)
when 1 then 'Y'
else 'N'
end as new_field
from SRC_TABLE s;
带有样本数据的完整测试用例:
with SRC_TABLE(col1,col2,col3,col4,col5) as
(
select 'ID001','SUPLIER_1',121.00, 'abc',123 from dual union all
select 'ID001','SUPLIER_2',100 , 'abc',123 from dual union all
select 'ID001','SUPLIER_3',201.12, 'abc',123 from dual union all
select 'ID002','SUPLIER_1',150.00, 'abc',123 from dual union all
select 'ID002','SUPLIER_3',150 , 'abc',123 from dual union all
select 'ID003','SUPLIER_1',100 , 'abc',123 from dual union all
select 'ID003','SUPLIER_2',100 , 'abc',123 from dual union all
select 'ID003','SUPLIER_3',201.12, 'abc',123 from dual
)
select
s.*
,case count(distinct col3)over(partition by col1)
when 1 then 'Y'
else 'N'
end as new_field
from SRC_TABLE s;
结果:
COL1 COL2 COL3 COL COL5 N
----- --------- ---------- --- ---------- -
ID001 SUPLIER_2 100 abc 123 N
ID001 SUPLIER_1 121 abc 123 N
ID001 SUPLIER_3 201.12 abc 123 N
ID002 SUPLIER_1 150 abc 123 Y
ID002 SUPLIER_3 150 abc 123 Y
ID003 SUPLIER_1 100 abc 123 N
ID003 SUPLIER_2 100 abc 123 N
ID003 SUPLIER_3 201.12 abc 123 N
8 rows selected.
【讨论】:
以上是关于如何检查oracle中列的所有值是不是相同的主要内容,如果未能解决你的问题,请参考以下文章
如果我有两列,我如何选择列的所有不同值,其中列永远不是特定值,因为 columnA 是相同的值?