日期:2014-05-18  浏览次数:20408 次

请教一个数据筛选问题
有一个表,字段为Category,Name,Value,Number。除了Value是int类型外,其它都是varchar(50)。
可能数据为:

SQL code

/*
Category  Name  Value  Number
分类1     A     1      A-001
分类1     A     2      A-002
分类1     A     3      A-102
分类1     B     1      A-082
分类1     A     2      A-003
分类1     A     3      A-002
分类1     A     1      A-002
*/



现在我需要这样的数据
SQL code

/*
Category  Name  Value  Number
分类1     A     1      A-001
分类1     A     1      A-002
分类1     A     2      A-003
分类1     B     1      A-082
分类1     A     3      A-102
*/


即Number有相同的编号时,只取Value为最小值的那条数据,并为Number列升序排列。

请问如何用SQL语句实现?最好给出可运行语句,谢谢!

------解决方案--------------------
SQL code

select Category,[Name],[Value],Number from t
    where t.[Value]=(select min([Value]) from t t1
            where t.Category=t1.Category and t.[Name]=t1.[Name] and t.[Number]=t1.[Number])
    order by t.Number
--t为你的表

------解决方案--------------------
SQL code

--> 测试数据:[test]
if object_id('[test]') is not null 
drop table [test]
go
create table [test](
[Category] varchar(5),
[Name] varchar(1),
[Value] int,
[Number] varchar(5)
)
go
insert [test]
select '分类1','A',1,'A-001' union all
select '分类1','A',2,'A-002' union all
select '分类1','A',3,'A-102' union all
select '分类1','B',1,'A-082' union all
select '分类1','A',2,'A-003' union all
select '分类1','A',3,'A-002' union all
select '分类1','A',1,'A-002'
go

select 
     [Category],
     [Name],
     [Value],
     [Number]
from
     (
select 
    px=ROW_NUMBER()over(partition by [Number],[Name],[Category] order by [Value]),*
from 
    test
     )t
where 
     px=1

/*
Category    Name    Value    Number
分类1    A    1    A-001
分类1    A    1    A-002
分类1    A    2    A-003
分类1    B    1    A-082
分类1    A    3    A-102
*/