首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修正多数函数

问修正多数函数
EN

Stack Overflow用户
提问于 2014-03-31 14:09:10
回答 2查看 61关注 0票数 0

我编写了oracle的多数sql查询,如以下所述:

Majority function in SQL

但我的要求略有不同。如果没有找到作为多数的列值,那么应该在查询中返回一个带有空值的行。我试过这样的方法:

代码语言:javascript
复制
select CASE WHEN count(*) > 0 THEN tbl2.DATA ELSE NULL END AS "Majority_column1_" from (
select distinct DATA
from (
  select DATA, NAME,
         count(*) over () as total_count, 
         count(*) over (partition by DATA) as DATA_count
  from MAJORITY_TEST
) tbl1 where tbl1.DATA_count > tbl1.total_count / 2) tbl2;

我的想法是检查是否完全没有。返回的行是>0,然后返回行值,否则返回null。但从语法上讲是不正确的。

有人能给我一个正确的查询吗。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-31 14:30:48

根据您对多数的定义,即50%的事件是该值,您只能返回零或一个值。所以,您可以只使用max()

代码语言:javascript
复制
select max(DATA)
from (
  select DATA, NAME,
         count(*) over () as total_count, 
         count(*) over (partition by DATA) as DATA_count
  from MAJORITY_TEST
) tbl1 where tbl1.DATA_count > tbl1.total_count / 2;

对于具有多数值的数据:

代码语言:javascript
复制
insert into majority_test (data, name)
select 10, 'A' from dual
union all select 20, 'B' from dual
union all select 20, 'C' from dual
union all select 20, 'D' from dual;

这意味着:

代码语言:javascript
复制
 MAX(DATA)
----------
        20 

聚合函数意味着您不需要distinct。没有多数,通过update majority_test set data = 10 where name = 'D',相同的查询提供:

代码语言:javascript
复制
 MAX(DATA)
----------

即具有空值的单个行。

票数 0
EN

Stack Overflow用户

发布于 2014-03-31 15:09:14

这里有一个获取值的方法。对data_count和total_count进行计算。然后选择具有最大data_count值的行。如果这超过阈值,则输出DATA值。否则,输出NULL

代码语言:javascript
复制
select (case when data_count > total_count / 2 then DATA end)
from (select DATA, 
             count(*) as DATA_count, over () as data_count, 
             sum(count(*)) over () as total_count
      from MAJORITY_TEST
      group by DATA
      order by data_count desc
     ) t
where rownum = 1;

注意,子查询使用显式聚合和解析函数。这只是另一种方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22763815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档