100分求一个MSSQL语句(关于分组再排序)!

bamfk10231023 2005-03-11 09:36:48
表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

意思是说取所有产品的时间最迟的一条记录!
大侠帮忙,不想写存储过程!
...全文
212 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ichi 2005-03-15
  • 打赏
  • 举报
回复
太好了,刚好要用到这个。一直想不出来, 在这谢谢大家了。
bamfk10231023 2005-03-14
  • 打赏
  • 举报
回复
都是强人啊!
askgwf2004 2005-03-12
  • 打赏
  • 举报
回复
--应该是不存在小于当前记录的吧!
--下面刚好写反了吧!不存在大于当前的记录那应是最小的了.

--如果 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)
WhiteHorseAlex 2005-03-12
  • 打赏
  • 举报
回复
select min(id),Field_A,max(Field_B)
from tablename
group by Field_A
zjcxc 2005-03-12
  • 打赏
  • 举报
回复
两个答案都对,但我想Xluzhong的效率会比较高。

如果就三个字段,这是对的,如果不只三个答案,那就有问题了
631799 2005-03-11
  • 打赏
  • 举报
回复

--如果 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)
631799 2005-03-11
  • 打赏
  • 举报
回复
select * from 表A a
where ( select count(*) from 表A where Field_A=a.Field_A and Field_B<a.Field_B)<1
bamfk10231023 2005-03-11
  • 打赏
  • 举报
回复
哈哈...
xluzhong 2005-03-11
  • 打赏
  • 举报
回复
其实这样也可以,为什么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
数据写的,呵呵!
bamfk10231023 2005-03-11
  • 打赏
  • 举报
回复
邹建老大也来啦,哈哈!
其实我刚开始我也想像他这么写的。。。
两个答案都对,但我想Xluzhong的效率会比较高。
zjcxc 2005-03-11
  • 打赏
  • 举报
回复
--写反了,最迟是最小的
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))
bamfk10231023 2005-03-11
  • 打赏
  • 举报
回复
其实这样也可以,为什么ID也要 min
select product,max(ttt)
from table1
xluzhong 2005-03-11
  • 打赏
  • 举报
回复
就是按产品分组,min找最小的id,max找最大的日期,也就是最近的日期
zjcxc 2005-03-11
  • 打赏
  • 举报
回复

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)
bamfk10231023 2005-03-11
  • 打赏
  • 举报
回复
原表
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



bamfk10231023 2005-03-11
  • 打赏
  • 举报
回复
结果是对的,但是不理解。。。。
bamfk10231023 2005-03-11
  • 打赏
  • 举报
回复
能告诉我为什么这样吗!
xluzhong 2005-03-11
  • 打赏
  • 举报
回复
select min(id),Field_A,max(Field_B)
from tablename
group by Field_A
---order by 条件 ---如果需要排序的话
xluzhong 2005-03-11
  • 打赏
  • 举报
回复
select min(id),Field_A,max(Field_B)
from tablename
group by Field_A

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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