繁体   English   中英

如何从SQL Server中的聚合方法获取不同的值

[英]How to get distinct values from aggregate method in SQL Server

我想选择最短和最长的名称,如果有多个相同长度的名称,我应该按名称排序第一个

例如,如果我具有以下值:

'abc', 'def', 'abcd', 'defghi', 'ghi'

我应该得到类似

abc    3
defghi 6

这是我的查询

select 
    Name, LEN(Name)
from 
    Customer
where 
    len(Name) = (select min(len(Name)) from Customer)
    or
    len(Name) = (select max(len(Name)) from Customer)
order by
    Name;

但是这就是我得到的

abc    3
def    3
defghi 6
ghi    3

我认为这是最容易与top union all最简单方法:

select *
from ((select top 1 c.*
       from customer
       order by len(name) desc, name
      ) union all
      (select top 1 c.*
       from customer
       order by len(name) asc, name
      )
     ) t;

具有窗口功能:

with cte as(select *, 
                   row_number() over(order by len(name), name) rn1,
                   row_number() over(order by len(name) desc, name) rn2
            from Customer)
select name, len(name) from cte where rn1 = 1 or rn2 = 1

您可以按长度和名称来订购它们,例如:

declare @data table(name varchar(10))
insert into @data(name) values('abc'), ('def'), ('abcd'), ('defghi'), ('ghi')

Select name From (
    Select *
        , small = ROW_NUMBER() over(order by len(name), name)
        , big = ROW_NUMBER() over(order by len(name) desc, name)
    From @data
) t
Where small = 1 or big = 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM