Порядок SQL по убыванию повторяющихся строк - PullRequest
0 голосов
/ 25 февраля 2019

Моя таблица выглядит следующим образом:

cust_ref | account_num  
123456  |     001132  
321234   | 123213  
325123 | 412312  
123456 | 312321 

В основном я пытаюсь отсортировать дублирующиеся строки cust_ref и упорядочить их так, чтобы все дубликаты были в порядке убывания от строки 1 вниз,то есть, если есть номер cust_ref, который соответствует 3 account_num, то он будет в более высокой строке по сравнению с cust_ref, который соответствует 2 account_num

например

cust_ref | account_num  
123456  |     001132  
123456 | 312321   
321234   | 123213  
325123 | 412312  

мой текущий запрос:

select cust_ref,  
       account_num  
from (
  select cust_ref,  
         account_num,  
         max(phone_num)  
   from table_name  
   group by cust_ref,  account_num
)  

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Ответ Фама лучше, чем этот, , но , если вы хотите сделать это в старой школе, что-то вроде этого должно сработать

declare  @cust_accts table 
( 
   cust_ref  int NOT NULL, 
   account_num int not null
)

insert into @cust_accts values (123456 , 001132)
insert into @cust_accts values (321234 , 123213)
insert into @cust_accts values (325123 , 412312)
insert into @cust_accts values (123456 , 312321)

select a.cust_ref, 
       a.account_num,
       b.acct_cnt
from   @cust_accts  a
join   
(
    select cust_ref, count(*) as acct_cnt
    from   @cust_accts
    group  by cust_ref
) b
on a.cust_ref = b.cust_ref
order by b.acct_cnt, a.cust_ref, a.account_num

Не уверен, почему мое шоу с ответами выше, чем у Фамаон гораздо элегантнее.

0 голосов
/ 25 февраля 2019

Похоже, вы хотите:

select cust_ref, account_num
from t
order by count(*) over (partition by cust_ref) desc,
         cust_ref,
         account_num;

Вы также можете включить счетчик в желаемые результаты, но результаты ваших выборок включают только два указанных столбца.

Если ваша база данных делаетне поддерживает оконные функции, вы также можете использовать подзапрос там.

0 голосов
/ 25 февраля 2019

Если ваша СУБД поддерживает window functions (analytic functions), то вы можете использовать это:

SELECT 
    SUM(COUNT(*)) OVER (PARTITION BY cust_ref) AS cnt,
    cust_ref, account_num, 
    MAX(phone_num) AS max_phone_num
FROM table_name
GROUP BY cust_ref, account_num
ORDER BY 1 DESC, 2, 3;    --cnt DESC, cust_ref, account_num

Протестировано в rextester for Oracle

Если вы хотите сделать заказ в каждой группетоже cust_ref, account_num, затем используйте это:

SELECT 
    SUM(COUNT(*)) OVER (PARTITION BY cust_ref) AS cnt,
    COUNT(*) AS cnt_in_group,
    cust_ref, account_num, 
    MAX(phone_num) AS max_phone_num
FROM table_name
GROUP BY cust_ref, account_num
ORDER BY cnt DESC, cnt_in_group DESC, cust_ref, account_num;   

Ссылка rextester

...