Oracle中的确定性stats_mode

时间:2011-10-31 15:39:31

标签: sql oracle

在Oracle中,stats_mode函数选择一组数据的模式。不幸的是,在绑定存在的情况下选择结果是不确定的(例如,stats_mode(1,2,1,2)可能返回1或2,具体取决于Oracle内部行的排序。在许多情况下,这是不可接受的。是否有能够为stats_mode函数提供自己的确定性排序的函数或好的技术?

2 个答案:

答案 0 :(得分:4)

STATS_MODE上的Oracle网页解释了If more than one mode exists, Oracle Database chooses one and returns only that one value

由于没有其他参数等,您无法改变它的行为。


但是,同一页面也显示以下示例查询可以生成多个模式值...

SELECT x FROM (SELECT x, COUNT(x) AS cnt1 FROM t GROUP BY x)
 WHERE cnt1 = (SELECT MAX(cnt2) FROM (SELECT COUNT(x) AS cnt2 FROM t GROUP BY x));

通过修改此类代码,您可以再次选择一个值,由指定的ORDER确定...

SELECT x FROM (SELECT x, MAX(y) AS y, COUNT(x) AS cnt1 FROM t GROUP BY x)
 WHERE cnt1 = (SELECT MAX(cnt2) FROM (SELECT COUNT(x) AS cnt2 FROM t GROUP BY x))
 AND rownum = 1
 ORDER BY y DESC;
不幸的是,有点麻烦,尽管你可以根据你的具体情况稍微整理一下。但我不知道其他根本不同的方法。

答案 1 :(得分:1)

选择具有最高频率的一组值中的值也可以通过计数和排序来完成。

select x from t group by x order by count(*) desc limit 1;

您也可以通过对值本身进行排序来确定它。

select x from t group by x order by count(*) desc, x desc limit 1;

我不太了解Oracles查询示例的复杂性,表现真的很糟糕。任何人都可以对这些差异有所了解吗?