2014-03-31 97 views
0

我寫甲骨文的多數sql查詢截至提到:
Majority function in SQL修改多數功能

但我的要求略有不同。如果沒有找到大多數列值,則應在查詢中返回空值單行。我試過類似的東西:

想法是檢查總數沒有。返回的行大於0,則返回行值,否則返回null。但在語法上它不正確。

有人可以爲我推薦一個正確的查詢。

感謝

+0

您需要從內聯視圖中將total_count作爲列返回,然後在CASE中引用該列。 – OldProgrammer

回答

0

根據您的意思是多數出現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) 
---------- 

即單行一個空值。

0

以下是獲取該值的方法。計算data_counttotal_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; 

請注意,子查詢使用具有分析函數的顯式聚合。這只是一種替代方法。