关于SQL Server只查出日期最新记录


       上午一同事问我一问题:有一个表中存有卡号和此卡的所有消费记录,怎么用一句简单的sql语句取出每张卡的最新一条记录然后用卡号去和别的表关联?

表示例(tb):

cardNO               CDate                        money       ...(其他字段)

001                      2012-01-01               100.00

001                      2012-01-02               208.00

002                      2012-01-02               15.00

003                      2012-01-03               200.00

001                      2012-02-02               12.15

003                      2012-06-06               0.01


        我乍一听,说:吆,这个问题挺纠结,用游标比较方便,可是表里有20+W条记录,效率不会很高,可是仔细一想,SQL Server里的 varchar ,date 等可以用min( ),max( )啊,这样问题就简单多了。

select cardNo,max(CDate) from tb group by cardNo;

        然后用查询结果的cardNo和其他表去关联。


        中午吃完饭看CSDN的论坛,在SQL Server大区,正好看见一个类似的问题。

问题如下:

一个报价表tb1:
字段:
id 自动编号(主键)
wuliaoName 物料名称
gongid 供应商
price 价格
date 日期

id wuliaoName gongid price date
1 W1 G1 500 2012-7-1  
2 W2 G2 200 2012-7-2
----  
3 W2 G5 300 2012-7-2
----  
4 W1 G1 399 2012-7-3
----  
5 W1 G3 100 2012-7-4
----
7 W3 G4 600 2012-7-4  
8 W3 G4 300 2012-7-5
----  

        现在需要找到不同物料,不同供应商,
最后日期价格,然后全部显示到页面上。
        比如,表中需要显示后面有红色标记都要显示,现在要确保 1.物料一样,供应商不同要显示, 2.物料 和 供应商 一致的选最后日期。
需要的结果:
id wuliaoName gongid price date
2 W2 G2 200 2012-7-2
----  
3 W2 G5 300 2012-7-2
----  
4 W1 G1 399 2012-7-3
----  
5 W1 G3 100 2012-7-4
----
8 W3 G4 300 2012-7-5
----


        他这个问题和我同事那个问题有2个地方不同,①他的是两个字段确定唯一性(类似联合主键)②需要显示本表中其他的字段而不是去关联其他表,其实这个差不多。

       我给出的方案是:

select t1.wuliaoName,t1.gongid,t1.price,t1.date from tb1 t1,
    (select wuliaoName,gongid,max(date) as date from tb1 group by wuliaoName,gongid) t2 
         where t1.wuliaoName = t2.wuliaoName and t1.gongid = t2.gongid and t1.date = t2.date;

        先以物料名称,供应商为唯一约束(group by wuliaoName,gongid)求出最后的时间,然后和本表以物料、供应商以及最后的时间为条件联接。


      当然原贴中还有大神的解决方案,大家可以去原帖看看,这里我就不详细说了。

      原帖地址:http://topic.csdn.net/u/20120720/11/5b8fc98b-7838-4706-9fc6-497cd54ecc7d.html?seed=1758281611&r=79180875#r_79180875





  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值