Как собрать строки вместе после использования аналитической функции

#sql #oracle #window-functions

#sql #Oracle #окно-функции

Вопрос:

 create table xyz ( contrno number , mobile number primary key); 

insert into xyz values(1003288127,123456); 
insert into xyz values(1003288127,123457); 
insert into xyz values(1003288127,123458); 
insert into xyz values(1003288127,123459); 
insert into xyz values(1003288127,123450); 
insert into xyz values(1003288127,123451); 
insert into xyz values(1003288127,123452); 
insert into xyz values(1003288127,123453); 
insert into xyz values(1003288127,123454); 
insert into xyz values(1003288127,123455); 
  

Я хочу, чтобы строки были расположены в порядке убывания количества contrno, и все строки contrno должны быть вместе, что означает, что число строк должно быть последовательным,
Я написал этот запрос

 select c.* 
from xyz c 
order by count(c.contrno) over ( partition by c.contrno ) desc) t 
  

который упорядочивает строки на основе количества contrno, которое является правильным, но не все contrno вместе

Но когда я запрашиваю число строк с помощью приведенного ниже запроса

 select k.* from (select rownum rn ,t.* from(select c.* 
from xyz c 
order by count(c.contrno) over ( partition by c.contrno ) desc) t ) k 
where k.contrno=1003288127 
  

Вывод

 rn contrno 
1 51024 1003288127 
2 51025 1003288127 
3 51089 1003288127 
4 51090 1003288127 
5 51091 1003288127 
6 51092 1003288127 
7 51093 1003288127 
8 51094 1003288127 
9 51095 1003288127 
10 51096 1003288127 
11 51097 1003288127 
  

Итак, здесь, если вы видите после 51024 и 51025, начинается 51089, а между 51025 и 51089 идет другой контрано.

Пожалуйста, ответьте, почему это происходит и как написать запрос, который может выдавать выходные данные на основе последовательного числа строк

Комментарии:

1. Я не понял эту часть, поэтому здесь, если вы видите после 51024 и 51025, начинается 51089, а между 51025 и 51089 идет другой контрано. Между 51025 ними и в 51089 результате ничего нет

2. в этой таблице миллион записей, я хочу упорядочить записи на основе количества contrno и собрать все строки вместе, но на самом деле, когда количество двух или более contrno равно, данные не собираются вместе на основе contrno, так что здесь, если вы видите, что после строк 51024 и 51025 начинается непосредственно 51089, а между ними 51025и 51089 других contrno. Я хочу, чтобы это было 51026 и продолжалось так.

Ответ №1:

Если я правильно понимаю, вы хотите сначала упорядочить по количеству, а затем по contrno:

 order by count(c.contrno) over ( partition by c.contrno ) desc, c.contrno
  

или даже с помощью мобильных устройств

 order by count(c.contrno) over ( partition by c.contrno ) desc, c.contrno,  c.mobile
  

Комментарии:

1. Сначала по count, затем по contrno