在Oracle中,stats_mode函数选择一组数据的模式。不幸的是,在绑定存在的情况下选择结果是不确定的(例如,stats_mode(1,2,1,2)可能返回1或2,具体取决于Oracle内部行的排序。在许多情况下,这是不可接受的。是否有能够为stats_mode函数提供自己的确定性排序的函数或好的技术?
答案 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查询示例的复杂性,表现真的很糟糕。任何人都可以对这些差异有所了解吗?