Oracle SQL 计算某列中的不同值

Posted

技术标签:

【中文标题】Oracle SQL 计算某列中的不同值【英文标题】:Oracle SQL Count distinct values in a certain column 【发布时间】:2021-07-02 14:30:54 【问题描述】:

我正在尝试使用特定逻辑查询表,并且我想删除 PERSON_ID 列中计数为 2 个或更多不同值的记录。我找不到合适的窗口查询来实现这一点。我已经尝试过使用:

SELECT 
CUSTOMER_ID, PERSON_ID, CODE,
DENSE_RANK() OVER (PARTITION BY CUSTOMER_iD, PERSON_ID ORDER BY PERSON_ID ASC) AS NR 
FROM TBL_1;

但我得到以下结果:

我想实现下面的结果,它根据某个 CUSTOMER_ID 计算 PERSON_ID 列中的不同值。在我的情况下,客户“444333”将是我要删除的记录,因为它有 2 个不同的 Person_Id

【问题讨论】:

【参考方案1】:

这是你需要的:

SELECT 
customer_id, count(distinct PERSON_ID) distinct_person_count
FROM TBL_1
group by customer_id

如果您想为 eahc 行显示它,您可以再次将其与表格连接:

select * from TBL_1 t
join (
     select customer_id, count(distinct PERSON_ID) distinct_person_count
     from TBL_1
     group by customer_id
) tt
on t.customer_id = tt.customer_id

注意:在窗口函数中不能有 distinct

【讨论】:

【参考方案2】:

如果您想要每行的不同计数,请使用窗口函数:

select t.*,
       count(distinct person_id) over (partition by customer_id)
from t;

Oracle确实在窗口函数中支持distinct

【讨论】:

以上是关于Oracle SQL 计算某列中的不同值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL Query,用于拆分和计算列中的值的功能?

计算不同单词在列中出现的次数 Oracle 12c SQL

如何为每个表计算由 SQL Server 中未指定数量的表共享的列中的不同值?

7.02 求某列中的最小最大值

如果第二列值在SQL中不相同,则计算一列中的不同值

用于计数和显示(列中的不同值)的 Sql 查询优化,按其他两列分组