CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

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

楼主bamfk10231023(银狐)2005-03-11 21:36:48 在 MS-SQL Server / 应用实例 提问

表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

相关问题

  • 分组排序SQL语句
  • select 语句, 如何一条实现, 先排序后分组?
  • select 语句,两个排序
  • 分组排序
  • 给大家拜个早年了,求一sql语句,关于分组排序方面?
  • 在cursor中怎order by 语句不排序?
  • Sql 语句字符串排序问题
  • 关于一个排序的sql语句
  • 排序查询语句的问题。。
  • 排序加标识,求一SQL语句

关键词

  • field
  • ttt
  • 产品
  • 记录
  • max
  • min
  • product
  • table
  • select

得分解答快速导航

  • 帖主:bamfk10231023
  • xluzhong
  • zjcxc
  • 631799
  • askgwf2004

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo