注册 登录
编程论坛 SQL Server论坛

SQL取得某字段最大值及过滤重复记录

shmhms2015 发布于 2015-08-09 22:00, 1870 次点击
表名:TAB1,字段有20多个,主键g。如图1.结果:d和e相等时,假设有三条记录,取得最大的f值所在的一条记录,其它两条过滤掉。如第二个图.哪位高手能帮忙?谢谢!
只有本站会员才能查看附件,请 登录
9 回复
#2
shmhms20152015-08-10 12:11
表名:TAB1,字段有20多个,主键g。如图1.结果:d和e相等时,假设有两条记录,取得最大的f值所在的一条记录,其它过滤掉。第二个图的SQL语句,不能过滤.哪位高手能帮忙?如何修改,谢谢!
只有本站会员才能查看附件,请 登录
#3
shmhms20152015-08-10 12:50
求高手帮忙,在线等。
CREATE TABLE [Table1] (
    [a] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [b] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [c] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [d] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [e] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [f] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [g] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [h] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [i] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [j] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [k] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [l] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [m] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [n] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [o] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [p] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [q] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [r] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [s] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [t] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [u] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [v] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [w] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [x] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [y] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [z] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    CONSTRAINT [PK_Table1] PRIMARY KEY  CLUSTERED
    (
        [g]
    )  ON [PRIMARY]
) ON [PRIMARY]
GO

Insert Into table1
(d,e,f,g)
Values
('1','1','1','a')
Insert Into table1
(d,e,f,g)
Values
('1','1','1','b')
Insert Into table1
(d,e,f,g)
Values
('2','1','1','c')
Insert Into table1
(d,e,f,g)
Values
('2','1','1','e')
Insert Into table1
(d,e,f,g)
Values
('3','1','3','d')

select * from table1 as a   
where  f=(select max(b.f)  
                  from table1 as b  
                  where a.d = b.d and a.e=b.e
                  );

[ 本帖最后由 shmhms2015 于 2015-8-10 13:00 编辑 ]
#4
kinvanhon2015-08-10 19:00
1L第二个图没错?d列有3个6...
#5
shmhms20152015-08-10 19:45
回复 4楼 kinvanhon 谢谢
第1楼的图不要了,看第2楼的图,表名:table1,字段有20个,主键g。结果:d和e相等时,假设有两条记录,取得最大的f值所在的一条记录,其它过滤掉。除d,e外,其它字段不考虑是否重复,但是要select *,就是要显示出所有字段,最后结果只有三条记录,就是要过滤掉我画粉框的那两条d和e相同的记录。

[ 本帖最后由 shmhms2015 于 2015-8-10 19:47 编辑 ]
#6
mxbing19842015-08-11 08:48
--sql2005+,很容易实现,借3楼的数据
--按d,e分组,f,g降序排列产生一个记录号id,然后过滤id=1的即可
select * from (
select *,ROW_NUMBER() over(PARTITION by d,e order by f desc,g desc) As id from Table1
) S where id=1

只有本站会员才能查看附件,请 登录
#7
mxbing19842015-08-11 08:54
select * from table1 as a   
where  g=(select top 1 g
                  from table1 as b  
                  where a.d = b.d and a.e=b.e   
                  order by f desc
                  )

--这个好像也行的,按d,e作为条件,f降序得到对应的一个g,然后按g过滤(g是关键字,才能唯一确定一条记录)
#8
shmhms20152015-08-11 10:09
回复 6楼 mxbing1984
我的是SQL SERVER2000,出现错误
服务器: 消息 195,级别 15,状态 10,行 2
'ROW_NUMBER' 不是可以识别的 函数名。
#9
shmhms20152015-08-11 10:13
回复 7楼 mxbing1984
谢谢,非常正确。
#10
shmhms20152015-08-11 13:16
回复 9楼 shmhms2015 临时表
select * from table1 as a   
where  g=(select top 1 g
                  from table1 as b  
                  where a.d = b.d and a.e=b.e   
                  order by f desc
                  )

能生成一个临时表吗?谢谢.把SQL改成生成一个临时表 #abc,或者按照主键g排序也行。
不用了,谢谢。

[ 本帖最后由 shmhms2015 于 2015-8-11 13:26 编辑 ]
1