我寫甲骨文的多數sql查詢截至提到:
Majority function in SQL修改多數功能
但我的要求略有不同。如果沒有找到大多數列值,則應在查詢中返回空值單行。我試過類似的東西:
想法是檢查總數沒有。返回的行大於0,則返回行值,否則返回null。但在語法上它不正確。
有人可以爲我推薦一個正確的查詢。
感謝
我寫甲骨文的多數sql查詢截至提到:
Majority function in SQL修改多數功能
但我的要求略有不同。如果沒有找到大多數列值,則應在查詢中返回空值單行。我試過類似的東西:
想法是檢查總數沒有。返回的行大於0,則返回行值,否則返回null。但在語法上它不正確。
有人可以爲我推薦一個正確的查詢。
感謝
根據您的意思是多數出現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)
----------
即單行一個空值。
以下是獲取該值的方法。計算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;
請注意,子查詢使用具有分析函數的顯式聚合。這只是一種替代方法。
您需要從內聯視圖中將total_count作爲列返回,然後在CASE中引用該列。 – OldProgrammer