детерминированный stats_mode в Oracle - PullRequest
3 голосов
/ 31 октября 2011

В Oracle функция stats_mode выбирает режим набора данных. К сожалению, он не является детерминированным при выборе, это приводит к наличию связей (например, stats_mode (1,2,1,2) может возвращать 1 или 2 в зависимости от порядка строк в Oracle. Во многих ситуациях это неприемлемо. Есть ли функция или хороший метод для обеспечения вашего собственного детерминированного порядка для функции stats_mode?

Ответы [ 2 ]

4 голосов
/ 31 октября 2011

Веб-страница Oracle на STATS_MODE объясняет, что 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 голос
/ 04 декабря 2017

Выбор значения среди набора значений с самой высокой частотой может также быть сделан путем подсчета и упорядочения.

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;

Я не совсем понимаю сложность примеров запросов к Oracle, производительность действительно плохая.Кто-нибудь может пролить свет на разницу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...