简体   繁体   English

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

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

I want to select the shortest and longest name, and if there is more than one name with the same length, I should get the first one ordered by the name 我想选择最短和最长的名称,如果有多个相同长度的名称,我应该按名称排序第一个

For example if I have these values: 例如,如果我具有以下值:

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

I should get something like 我应该得到类似

abc    3
defghi 6

This is my query 这是我的查询

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;

but here is what I get 但是这就是我得到的

abc    3
def    3
defghi 6
ghi    3

I think this is easiest as a union all with top : 我认为这是最容易与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 window functions: 具有窗口功能:

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

You can order them by length and name like: 您可以按长度和名称来订购它们,例如:

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