我编写了oracle的多数sql查询,如以下所述:
但我的要求略有不同。如果没有找到作为多数的列值,那么应该在查询中返回一个带有空值的行。我试过这样的方法:
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。但从语法上讲是不正确的。
有人能给我一个正确的查询吗。
谢谢
发布于 2014-03-31 14:30:48
根据您对多数的定义,即50%的事件是该值,您只能返回零或一个值。所以,您可以只使用max()
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;对于具有多数值的数据:
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;这意味着:
MAX(DATA)
----------
20 聚合函数意味着您不需要distinct。没有多数,通过update majority_test set data = 10 where name = 'D',相同的查询提供:
MAX(DATA)
----------即具有空值的单个行。
发布于 2014-03-31 15:09:14
这里有一个获取值的方法。对data_count和total_count进行计算。然后选择具有最大data_count值的行。如果这超过阈值,则输出DATA值。否则,输出NULL
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;注意,子查询使用显式聚合和解析函数。这只是另一种方法。
https://stackoverflow.com/questions/22763815
复制相似问题