Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> 查询  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701872
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

如何实现分组按日期排倒序再按ID排倒序每组取一条记录?

作者:cg1  摘自:access911.net  :cg1  更新日期:2010-4-16  浏览人次:

 

问题:

有个问题:

         数据表:
               id              组号              日期              数值
                 1                15          2010-5-1                55
                 2                15          2010-1-1                68
                 3                11          2010-7-1                 1
                 4                19          2010-4-1            332223
                 5                11          2010-8-1               323
                 6                 7          2010-1-1                40
                 7                 9          2010-2-1               378


         查询结果
               id              组号              日期              数值
                 1                15          2010-5-1                55
                 4                19          2010-4-1            332223
                 5                11          2010-8-1               323
                 6                 7          2010-1-1                40
                 7                 9          2010-2-1               378


要求是根据数据表的内容,按日期排序取每组最后那条记录的数值,如果日期有重复那么取ID最大的那条。而且注意要先按日期排倒序,再按ID排倒序,每组只取一条。

 


回答:

SELECT b.*
FROM [temp] AS a 
    right JOIN [temp] AS b ON (a.日期>b.日期 
                                        or (a.日期=b.日期 and  a.ID>b.ID)) 
    AND a.组号 =b.组号
where a.id is null


或者

select a.*     
from [temp] as   a     
where     
    not exists(select 1
                from [temp] as b     
                where     
                    组号=a.组号 
                    and (日期>a.日期 
                        or (日期=a.日期 and ID>a.ID))) 

 


Function CreateExampleTable()
    CurrentProject.Connection.Execute "create table [temp] (id AUTOINCREMENT(1,1) ,[组号] string,[日期] date,[数值] long)  "
    CurrentProject.Connection.Execute "insert into [temp](id,组号,日期,数值) values(1,15,#2010-5-1#,55)    "
    CurrentProject.Connection.Execute "insert into [temp](id,组号,日期,数值) values(2,15,#2010-1-1#,68)    "
    CurrentProject.Connection.Execute "insert into [temp](id,组号,日期,数值) values(3,11,#2010-7-1#,1)    "
    CurrentProject.Connection.Execute "insert into [temp](id,组号,日期,数值) values(4,19,#2010-4-1#,332223)    "
    CurrentProject.Connection.Execute "insert into [temp](id,组号,日期,数值) values(5,11,#2010-8-1#,323)    "
    CurrentProject.Connection.Execute "insert into [temp](id,组号,日期,数值) values(6,7,#2010-1-1#,40) "
    CurrentProject.Connection.Execute "insert into [temp](id,组号,日期,数值) values(7,9,#2010-2-1#,378) "
End Function

Function CreateQuery()
    CurrentProject.Connection.Execute "create view [V_先按日期再按ID排序取每组最后一条数据] as SELECT b.* FROM [temp] AS a    right JOIN [temp] AS b ON (a.日期>b.日期                                         or (a.日期=b.日期 and  a.ID>b.ID))    AND a.组号 =b.组号 where a.id is null"
End Function



附记:在T-SQL中为没有ID列的表生成ID字段的方法:
select newid() as id,* from table
select identity(int,1,1) as ID ,* into temptable from loginuser

本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
     关于 Partition 函数在分组查询中的应用
     新手来看:如何写分组取前N条的 SQL 语句?
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利