Oracle STATS_MODE返回随机(?)号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle STATS_MODE返回随机(?)号相关的知识,希望对你有一定的参考价值。

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

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

答案

手册没有明确说明行为是确定性的......

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)的行为会有所不同。

另一答案

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

那么没有模式时Oracle会做什么?

如果列的所有值都是NULLs STATS_MODEreturns NULL

如果列中存在至少一个值,则存在MODEalways。

在某些情况下,有更多键具有最高频率(也称为MODE)。在这种情况下,返回这些键的一些(非确定性)值。因此,您可能会观察到随机行为,但仅限于频率最高的键。

以上是关于Oracle STATS_MODE返回随机(?)号的主要内容,如果未能解决你的问题,请参考以下文章

返回Oracle表中5%记录的随机样本

oracle的随机函数是啥?

Oracle随机函数

Oracle 中实现随机抽取数据

如何从oracle数据库中随机获取记录?

oracle中使用DBMS_RANDOM去产生随机数