[英]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.