技术开发 频道

一段查询代码的实现与讨论

    【IT168 MSSQL文档】求代码来查询每一个人的最后一条记录的.
    姓名 顺号 金额
    张三 1 2232
    张三 2 4573
    张三 3 3432
    张三 4 1326
    张三 5 5472
    李四 1 556
    李四 2 950
    李四 3 886
   
    就是想找出"张三 5 5472和李四 3 886 "这样的记录来.
    另外,若然这里的顺号变为是日期类型的又如何查询.
  
    --------------------------------------------------------------------------------
    作者:flywolf2000    时间:04-09-22 10:43
   
    select 姓名,max(顺号) as 最大顺号 from tablename group by 姓名
    如果是日期用convert函数转换。
   
   
    --------------------------------------------------------------------------------
    作者:lynx286    时间:04-09-22 13:13
   
    select * from 表 a where 顺号=(select max(顺号) from 表 where 姓名=a.姓名)
   
   
    --------------------------------------------------------------------------------
    作者:magicangel    时间:04-09-22 15:51
   
    --建立测试数据表
    select 1 id,'006' name,6 flag_id
    into flag
    union all
    select 2,'002',6
    union all
    select 5,'006',6
    union all
    select 2,'003',6
    union all
    select 3,'003',6
    union all
    select 1 ,'002',6
    union all
    select 1 ,'002',6
   
    --答案一
    select distinct a.*
    from flag a where exists(select * from flag where id=a.id having max(name)=a.name)
   
    --答案二
    select distinct a.* from flag a, (select id,max(name) name from flag group by id) b
    where a.id=b.id and a.name=b.name
   
    --答案三
    select * from flag a where name=(select max(name) from flag where id=a.id)
   
    --第三个答案的效率比较高
   
    --建聚集索引的话可以优化上面的三个答案
    create clustered index ix_flag on flag(id)
 
0
相关文章