100分求一个MSSQL语句(关于分组再排序)!
表A
ID Field_A Field_B
1 产品1 2005-5-1
2 产品2 2005-5-1
3 产品1 2005-3-1
4 产品2 2005-6-1
结果要:
ID FIELD_A FIELD_B
1 产品1 2005-5-1
2 产品2 2005-6-1
意思是说取所有产品的时间最迟的一条记录!
大侠帮忙,不想写存储过程!
问题点数:100、回复次数:19Top
1 楼xluzhong(Ralph)回复于 2005-03-11 21:38:50 得分 40
select min(id),Field_A,max(Field_B)
from tablename
group by Field_ATop
2 楼xluzhong(Ralph)回复于 2005-03-11 21:40:02 得分 0
select min(id),Field_A,max(Field_B)
from tablename
group by Field_A
---order by 条件 ---如果需要排序的话Top
3 楼bamfk10231023(银狐)回复于 2005-03-11 21:51:16 得分 0
能告诉我为什么这样吗!Top
4 楼bamfk10231023(银狐)回复于 2005-03-11 21:51:33 得分 0
结果是对的,但是不理解。。。。Top
5 楼bamfk10231023(银狐)回复于 2005-03-11 21:54:06 得分 0
原表
select * from table1
ID PRODUCT TTT
1 A 2004-04-04 00:00:00.000
2 A 2004-04-01 00:00:00.000
3 B 2004-04-01 00:00:00.000
4 B 2004-04-04 00:00:00.000
结果!
select min(id),product,max(ttt)
from table1
group by product
ID Product TTT
1 A 2004-04-04 00:00:00.000
3 B 2004-04-04 00:00:00.000
Top
6 楼zjcxc(邹建)回复于 2005-03-11 21:54:44 得分 40
select * from 表A a
where not exists( --不存在Field_A与当前相同,Field_B 比当前记录更大的记录就行了
select * from 表A where Field_A=a.Field_A and Field_B>a.Field_B)Top
7 楼xluzhong(Ralph)回复于 2005-03-11 21:55:29 得分 0
就是按产品分组,min找最小的id,max找最大的日期,也就是最近的日期Top
8 楼bamfk10231023(银狐)回复于 2005-03-11 21:55:34 得分 0
其实这样也可以,为什么ID也要 min
select product,max(ttt)
from table1
Top
9 楼zjcxc(邹建)回复于 2005-03-11 21:57:07 得分 0
--写反了,最迟是最小的
select * from 表A a
where not exists( --不存在Field_A与当前相同,Field_B 比当前记录更小的记录就行了
select * from 表A where Field_A=a.Field_A and Field_B<a.Field_B)
--如果 Field_B 不能做主键,可以这样写
select * from 表A a
where not exists(
select * from 表A
where Field_A=a.Field_A
and(
Field_B<a.Field_B
--Field_B相同时,取id最大的
or Field_B=a.Field_B and id<a.id))Top
10 楼bamfk10231023(银狐)回复于 2005-03-11 21:58:48 得分 0
邹建老大也来啦,哈哈!
其实我刚开始我也想像他这么写的。。。
两个答案都对,但我想Xluzhong的效率会比较高。Top
11 楼xluzhong(Ralph)回复于 2005-03-11 22:09:25 得分 0
其实这样也可以,为什么ID也要 min
---俺是根据你所给的
表A
ID Field_A Field_B
1 产品1 2005-5-1
2 产品2 2005-5-1
3 产品1 2005-3-1
4 产品2 2005-6-1
结果要:
ID FIELD_A FIELD_B
1 产品1 2005-5-1
2 产品2 2005-6-1
数据写的,呵呵!Top
12 楼bamfk10231023(银狐)回复于 2005-03-11 22:11:19 得分 0
哈哈...Top
13 楼631799(杭州工人)回复于 2005-03-11 22:44:01 得分 10
select * from 表A a
where ( select count(*) from 表A where Field_A=a.Field_A and Field_B<a.Field_B)<1
Top
14 楼631799(杭州工人)回复于 2005-03-11 22:56:27 得分 0
--如果 Field_B 不能做主键
select * from 表A a
where not exists(
select * from 表A
where Field_A=a.Field_A and Field_B<a.Field_B)
and id=(
select max(id) from 表A where Field_B=a.Field_B and Field_A=a.Field_A)
Top
15 楼zjcxc(邹建)回复于 2005-03-12 08:06:19 得分 0
两个答案都对,但我想Xluzhong的效率会比较高。
如果就三个字段,这是对的,如果不只三个答案,那就有问题了
Top
16 楼WhiteHorseAlex()回复于 2005-03-12 10:07:23 得分 0
select min(id),Field_A,max(Field_B)
from tablename
group by Field_A
Top
17 楼askgwf2004(管管)回复于 2005-03-12 10:31:52 得分 10
--应该是不存在小于当前记录的吧!
--下面刚好写反了吧!不存在大于当前的记录那应是最小的了.
--如果 Field_B 不能做主键,可以这样写
select * from 表A a
where not exists(
select * from 表A
where Field_A=a.Field_A
and(
Field_B<a.Field_B
--Field_B相同时,取id最大的
or Field_B=a.Field_B and id<a.id))
--下面的也是应该是不存在于小于当前记录,如果用大于前记录那应该是exists.是这样的吧!
--如果 Field_B 不能做主键
select * from 表A a
where not exists(
select * from 表A
where Field_A=a.Field_A and Field_B<a.Field_B)
and id=(
select max(id) from 表A where Field_B=a.Field_B and Field_A=a.Field_A)Top
18 楼bamfk10231023(银狐)回复于 2005-03-14 00:35:19 得分 0
都是强人啊!Top
19 楼ichi(冷血红心)回复于 2005-03-15 08:42:01 得分 0
太好了,刚好要用到这个。一直想不出来, 在这谢谢大家了。Top




