求一这样一条SQL语句,困扰我好几天了!!

jianye2008 2011-12-31 12:07:16
有如下表
表t
字段1,字段2,字段3
1 201 aa
1 201 bb
1 200 cc
2 301 dd
2 301 ee
2 300 ff
3 401 gg
3 401 hh
3 400 ii
想得到如下结果,

1 201 aa
2 301 dd
3 401 gg

也就是说字段2有重复的话,只取一个,我用max()查,它却把重复的全列出来了,
以上请高手指点啊!
...全文
79 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianye2008 2012-01-02
  • 打赏
  • 举报
回复
我明白了。
jianye2008 2012-01-02
  • 打赏
  • 举报
回复
再次问一下楼上的大侠,我用ROW_NUMBER() over 查的是最大的值,如果查最小值应该用什么函数?
dawugui 2011-12-31
  • 打赏
  • 举报
回复
--sql 2000
create table t(字段1 int,字段2 int,字段3 varchar(10))
insert into t values(1 ,201 ,'aa')
insert into t values(1 ,201 ,'bb')
insert into t values(1 ,200 ,'cc')
insert into t values(2 ,301 ,'dd')
insert into t values(2 ,301 ,'ee')
insert into t values(2 ,300 ,'ff')
insert into t values(3 ,401 ,'gg')
insert into t values(3 ,401 ,'hh')
insert into t values(3 ,400 ,'ii')
go

select m.* from t m where not exists(select 1 from t where 字段1=m.字段1 and (字段2 > m.字段2 or (字段2 = m.字段2 and 字段3 < m.字段3))) order by m.字段1

/*
字段1 字段2 字段3
----------- ----------- ----------
1 201 aa
2 301 dd
3 401 gg

(所影响的行数为 3 行)

*/

select 字段1,字段2,字段3 from
(
select m.* , px = (select count(1) from t where 字段1=m.字段1 and (字段2 > m.字段2 or (字段2 = m.字段2 and 字段3 < m.字段3))) + 1 from t m
) k where px = 1
order by 字段1
/*
字段1 字段2 字段3
----------- ----------- ----------
1 201 aa
2 301 dd
3 401 gg

(所影响的行数为 3 行)

*/


drop table t




--sql 2005
create table t(字段1 int,字段2 int,字段3 varchar(10))
insert into t values(1 ,201 ,'aa')
insert into t values(1 ,201 ,'bb')
insert into t values(1 ,200 ,'cc')
insert into t values(2 ,301 ,'dd')
insert into t values(2 ,301 ,'ee')
insert into t values(2 ,300 ,'ff')
insert into t values(3 ,401 ,'gg')
insert into t values(3 ,401 ,'hh')
insert into t values(3 ,400 ,'ii')
go

select m.* from t m where not exists(select 1 from t where 字段1=m.字段1 and (字段2 > m.字段2 or (字段2 = m.字段2 and 字段3 < m.字段3))) order by m.字段1

/*
字段1 字段2 字段3
----------- ----------- ----------
1 201 aa
2 301 dd
3 401 gg

(3 行受影响)

*/

select 字段1,字段2,字段3 from
(
select m.* , px = row_number() over(partition by 字段1 order by 字段2 desc , 字段3) from t m
) k where px = 1
order by 字段1
/*
字段1 字段2 字段3
----------- ----------- ----------
1 201 aa
2 301 dd
3 401 gg

(3 行受影响)

*/


drop table t

dawugui 2011-12-31
  • 打赏
  • 举报
回复
create table t(字段1 int,字段2 int,字段3 varchar(10))
insert into t values(1 ,201 ,'aa')
insert into t values(1 ,201 ,'bb')
insert into t values(1 ,200 ,'cc')
insert into t values(2 ,301 ,'dd')
insert into t values(2 ,301 ,'ee')
insert into t values(2 ,300 ,'ff')
insert into t values(3 ,401 ,'gg')
insert into t values(3 ,401 ,'hh')
insert into t values(3 ,400 ,'ii')
go

select m.* from t m where not exists(select 1 from t where 字段1=m.字段1 and (字段2 > m.字段2 or (字段2 = m.字段2 and 字段3 < m.字段3))) order by m.字段1

drop table t

/*
字段1 字段2 字段3
----------- ----------- ----------
1 201 aa
2 301 dd
3 401 gg

(所影响的行数为 3 行)

*/
dawugui 2011-12-31
  • 打赏
  • 举报
回复
select m.* from t m where not exists(select 1 from t where 字段1=m.字段1 and (字段2 > m.字段2 or (字段2 = m.字段2 and 字段3 < m.字段3))) order by m.字段1
jianye2008 2011-12-31
  • 打赏
  • 举报
回复
感谢楼上两位大侠!帮了我大忙了,谢谢!
guostong 2011-12-31
  • 打赏
  • 举报
回复
select * from
(
select
t.*, ROW_NUMBER() over (partition by c1 order by c2 desc, c3) od
from t
) tt
where od = 1

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧