Как получить наиболее частое значение в массиве в sql? - PullRequest
0 голосов
/ 15 января 2020

Я новичок ie в SQL.

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

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

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

Возможно ли это с 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 ]

1 голос
/ 16 января 2020

Вы можете сделать это в 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;

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

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

1 голос
/ 15 января 2020

В первую очередь массивы входят в состав 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...