Oracle STATS_MODE返回随机(?)号

时间:2018-03-23 07:35:07

标签: sql oracle statistics

我正在使用STATS_MODE来获取列的模式,我手动检查了我的数据与结果,但没有模式,每个值都是唯一的。

那么没有模式时Oracle会做什么?对我来说,它看起来只是返回一个随机数。如果没有模式,有没有办法获得MAX值?

4 个答案:

答案 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
       );