我正在使用STATS_MODE
来获取列的模式,我手动检查了我的数据与结果,但没有模式,每个值都是唯一的。
那么没有模式时Oracle会做什么?对我来说,它看起来只是返回一个随机数。如果没有模式,有没有办法获得MAX值?
答案 0 :(得分:1)
stats_mode
将返回多次出现的值,因此如果您有唯一值,那么您使用它的原因是什么?从oracle doc开始,您可以调整此查询以获取最大值
SELECT commission_pct FROM
(SELECT commission_pct, COUNT(commission_pct) AS cnt1 FROM employees
GROUP BY commission_pct)
WHERE cnt1 =
(SELECT MAX (cnt2) FROM
(SELECT COUNT(commission_pct) AS cnt2
FROM employees GROUP BY commission_pct));
答案 1 :(得分:1)
手册没有明确说明行为是确定性的......
STATS_MODE将一组值作为其参数,并返回该值 以最快的频率发生。如果存在多个模式, 然后Oracle数据库选择一个并仅返回一个值。
你可以轻松测试这个,并返回最大值:
select stats_mode(n) as oracle_stats_mode
,case when count(n) = count(distinct n) -- If all records are unique
then max(n) -- return the max
else stats_mode(n) -- else return oracle's stats_mode
end as your_stats_mode
from (select 1 as n from dual union all
select 2 as n from dual union all
--select 2 as n from dual union all
--select null as n from dual union all
select 3 as n from dual
);
尝试使用和不使用重复的n = 2和n = null。还要注意count(*)和count(n)的行为会有所不同。
答案 2 :(得分:0)
那么没有模式时Oracle会做什么?
如果列的所有值均为NULL
s STATS_MODE
,则返回NULL
。
如果列MODE
中至少存在一个值。
在某些情况下,有更多频率最高的键(也称为MODE)。在这种情况下,返回这些键的一些(非确定性)值。因此,您可能会观察到随机行为,但仅限于频率最高的键。
答案 3 :(得分:0)
使用此: 当模式数相同时,查询返回较高的数字:
select **ABS(stats_mode(n*-1))** as oracle_stats_mode
,case when count(n) = count(distinct n) -- If all records are unique
then max(n) -- return the max
else stats_mode(n) -- else return oracle's stats_mode
end as your_stats_mode
from (select 1 as n from dual union all
select 2 as n from dual union all
--select 2 as n from dual union all
--select null as n from dual union all
select 3 as n from dual
);