SQL顺序按重复行降序排列

时间:2019-02-25 02:50:24

标签: sql oracle duplicates sql-order-by

我的桌子如下:

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 :(得分:1)

Pham的答案比这更好,但是,如果您想在老派上做,类似的事情应该可以

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

不确定我的答案显示为何比范姆高,他的优雅得多。

答案 1 :(得分:0)

如果RDBMS支持 li:first-child:nth-last-child(8), li:first-child:nth-last-child(8) ~ li{ background-color: $primary-accent; color: white; padding: 10px; border: 1px solid white; } ,则可以使用以下方法:

window functions (analytic functions)

rextester for Oracle

中进行了测试

如果您也想在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 的每组中订购,请使用以下方法:

cust_ref, account_num

链接rextester

答案 2 :(得分:0)

您似乎想要:

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

您也可以将计数包括在所需结果中,但是样本结果仅包括两个指定的列。

如果您的数据库不支持窗口功能,则也可以在其中使用子查询。