标题:SQL取得某字段最大值及过滤重复记录
只看楼主
shmhms2015
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2015-8-9
结帖率:0
已结贴  问题点数:20 回复次数:9 
SQL取得某字段最大值及过滤重复记录
表名:TAB1,字段有20多个,主键g。如图1.结果:d和e相等时,假设有三条记录,取得最大的f值所在的一条记录,其它两条过滤掉。如第二个图.哪位高手能帮忙?谢谢!
搜索更多相关主题的帖子: 最大值 最大的 记录 
2015-08-09 22:00
shmhms2015
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2015-8-9
得分:0 
表名:TAB1,字段有20多个,主键g。如图1.结果:d和e相等时,假设有两条记录,取得最大的f值所在的一条记录,其它过滤掉。第二个图的SQL语句,不能过滤.哪位高手能帮忙?如何修改,谢谢!
2015-08-10 12:11
shmhms2015
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2015-8-9
得分:0 
求高手帮忙,在线等。
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 编辑 ]
2015-08-10 12:50
kinvanhon
Rank: 5Rank: 5
来 自:战争学院
等 级:贵宾
威 望:16
帖 子:99
专家分:258
注 册:2014-10-7
得分:10 
1L第二个图没错?d列有3个6...
2015-08-10 19:00
shmhms2015
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2015-8-9
得分:0 
回复 4楼 kinvanhon 谢谢
第1楼的图不要了,看第2楼的图,表名:table1,字段有20个,主键g。结果:d和e相等时,假设有两条记录,取得最大的f值所在的一条记录,其它过滤掉。除d,e外,其它字段不考虑是否重复,但是要select *,就是要显示出所有字段,最后结果只有三条记录,就是要过滤掉我画粉框的那两条d和e相同的记录。

[ 本帖最后由 shmhms2015 于 2015-8-10 19:47 编辑 ]
2015-08-10 19:45
mxbing1984
Rank: 7Rank: 7Rank: 7
来 自:贵州道真
等 级:贵宾
威 望:37
帖 子:73
专家分:342
注 册:2014-8-8
得分:10 
--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


天再高,踮起脚尖就能更接近阳光
2015-08-11 08:48
mxbing1984
Rank: 7Rank: 7Rank: 7
来 自:贵州道真
等 级:贵宾
威 望:37
帖 子:73
专家分:342
注 册:2014-8-8
得分:0 
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是关键字,才能唯一确定一条记录)
收到的鲜花
  • shmhms20152015-08-11 10:14 送鲜花  3朵   附言:我很赞同

天再高,踮起脚尖就能更接近阳光
2015-08-11 08:54
shmhms2015
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2015-8-9
得分:0 
回复 6楼 mxbing1984
我的是SQL SERVER2000,出现错误
服务器: 消息 195,级别 15,状态 10,行 2
'ROW_NUMBER' 不是可以识别的 函数名。
2015-08-11 10:09
shmhms2015
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2015-8-9
得分:0 
回复 7楼 mxbing1984
谢谢,非常正确。
2015-08-11 10:13
shmhms2015
Rank: 1
等 级:新手上路
帖 子:10
专家分:7
注 册:2015-8-9
得分:0 
回复 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 编辑 ]
2015-08-11 13:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-456246-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.066523 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved