#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