Как получить наиболее частое значение в массиве в sql?

Я новичок в SQL.

Я построил массив, в котором я хранил значения, которые я собирал в цикле, и делил их на другое значение.

Массив имеет правильные значения.

Теперь мне нужно получить самое повторное значение в этом массиве.

Это возможно с SQL? Моя среда - Oracle 11.

Это массив:

type array_type is varray(100) of NUMBER(10);
loop_results array_type := array_type();

Ценности:

 1: 906450
 2: 906450
 3: 306449
 4: 906446
 5: 306450
 6: 906447
 7: 306449
 8: 306448
 9: 306448
10: 306450

Спасибо за ваше время.

Всего 2 ответа


В первую очередь в состав pl / sql входят массивы. Аналогично попробуйте ниже. Ниже будет несколько легко использовать временную таблицу.

  Create table sample(value1 
   number(10));
  Declare
  type array_type is varray(100) of 
  NUMBER(10);
  loop_results array_type := array_type();
   Max varchar2(20);

    begin
     for i in 1..loop_results.length
     loop
     Insert into sample values
     (loop_results(i)) ;

     End loop
     Select value1 into max from(Select 
      Value1, 
      count(*) 
       from sample order by count(*) desc
      Group by value1) where rownum=1;

   dbms_output.put_line(max) ;

     End

Вы можете сделать это в SQL, если тип объявлен в области SQL:

CREATE TYPE array_type is varray(100) of NUMBER(10);

Тогда (решение Oracle 12+)

SELECT COLUMN_VALUE,
       COUNT(*)
FROM   TABLE(
         array_type(
           906450,
           906450,
           306449,
           906446,
           306450,
           906447,
           306449,
           306448,
           306448,
           306450
         )
       )
GROUP BY COLUMN_VALUE
ORDER BY COUNT(*) DESC
FETCH FIRST 1 ROW WITH TIES;

или (для более ранних версий вы можете использовать аналитические функции):

SELECT value,
       cnt
FROM   (
  SELECT COLUMN_VALUE AS value,
         COUNT(*) As cnt,
         DENSE_RANK() OVER ( ORDER BY COUNT(*) DESC ) AS rnk
  FROM   TABLE(
           array_type(
             906450,
             906450,
             306449,
             906446,
             306450,
             906447,
             306449,
             306448,
             306448,
             306450
           )
         )
  GROUP BY COLUMN_VALUE
)
WHERE  rnk = 1;

Выводит все значения, которые привязаны к самой высокой частоте:

COLUMN_VALUE | COUNT(*)
-----------: | -------:
      306449 |        2
      906450 |        2
      306450 |        2
      306448 |        2

БД <> Скрипка Oracle 18 или Oracle 11


Есть идеи?

10000