原始表
ID 姓名 类型 时间
1 A    下井    2012-03-14 23:56:51
2 A    上井    2012-03-15 23:57:00
3 B    下井    2012-03-14 23:57:05
4 C    下井    2012-03-14 23:59:00
5 A    上井    2012-03-15 23:56:51
6 B    上井    2012-03-15 23:58:05结果
姓名 下井时间 上井时间
A    2012-03-14 23:56:51 2012-03-15 23:57:00
B    2012-03-14 23:57:05 2012-03-15 23:58:05
C    2012-03-14 23:59:00 null“下井”记录与最近时间的“上井”记录匹配,没有匹配则留空昨天想了一天都没搞定,求助各位兄弟了。

解决方案 »

  1.   


    select a.姓名,a.下井时间,b.上井时间
    from tb a outer apply (select top 1 上井时间 from tb 
                                         where 姓名 = t.姓名 and 类型 = '上井' and id >= t.id order by id) b
    where a.类型 = '下井'
      

  2.   

    select *
    from 原始表 as a
    left join 原始表 as b on a.姓名=b.姓名 and b.类型='上井' and ID=(select min(ID) from 原始表 where 姓名=b.姓名 and 类型=b.类型 and ID>a.ID)
    where a.类型='下井'
      

  3.   

    本帖最后由 josy 于 2012-07-11 09:55:22 编辑
      

  4.   

    select 姓名,MAX(case when 类型='上井' then 时间 else null end) as 上井时间,
    MAX(case when 类型='下井' then 时间 else null end) as 下井时间 from tb group by 姓名
      

  5.   

    谢谢各位:
    select 姓名,时间 as 下井时间,
      (select top 1 时间 from tb where 姓名=t.姓名 and 时间>t.时间 and 类型='上井' order by 时间) as 上井时间
    from tb t
    where 类型='下井'看起来效率很低,但是2万条数据的测试结果 2楼 17秒,3楼1秒