日期:2014-05-18  浏览次数:20695 次

关于一张表的sql统计。急急急
2011-12-15 12:54:56.000 个人账户开立 PN120111215125456 0.00 杨建 不成功
2011-12-15 12:55:37.000 个人账户开立 PN120111215125537 0.00 杨建 成功
2011-12-15 12:56:12.000 个人账户开立 PN120111215125556 0.00 刘君 不成功
2011-12-15 12:56:53.000 个人账户开立 PN120111215125652 0.00 刘君 不成功
2011-12-15 14:22:01.000 大额支付 PN220111215142137 0.00 杨建 成功
2011-12-15 14:55:17.000 大额支付 PN220111215145449 0.00 杨建 不成功
2011-12-15 14:57:19.000 单位账户开立 PN3020111215145706 0.00 杨建 不成功
2011-12-15 15:25:42.000 单位账户开立 PN3020111215152542 0.00 杨建 成功
2011-12-15 15:51:58.000 挂失业务 PN120111215155158 0.00 杨建 成功
2011-12-15 13:01:20.000 大额支付 PN220111215130100 50.00 杨建 不成功
2011-12-15 13:01:56.000 大额支付 PN120111215130156 50.00 杨建 不成功
2011-12-15 13:02:28.000 大额支付 PN120111215130216 50.00 杨建 不成功
2011-12-15 15:31:47.000 单位账户开立 PN120111215153137 0.00 杨建 不成功

上面是表里面的数据,我要统计的sql是显示出 每个凭证号的时间最大的成功的记录,如果该凭证号没成功的记录就取出时间最大的不成功的那条记录。这个sql2005的语句杂写呢?大家帮帮忙,。急

------解决方案--------------------
SQL code
select distinct b.* from tb a
cross apply (select top 1 * from tb 
   where 凭证号=a.凭证号 order by 是否成功字段,时间字段 desc) b

------解决方案--------------------
SQL code
select * from 
(select no=row_number() over(partition by 凭证号 order by 是否成功字段,时间字段 desc),* from tb) t
where no=1

------解决方案--------------------
SQL code
;with cte as(
select * from tb a where 状态='成功' not exists(select 1 from tb where 姓名=a.姓名 and 状态='成功' and 日期>a.日期)
)select * from tb a where 姓名 not in(select 姓名 from cte) and not exists(select 1 from tb where 姓名=a.姓名 and 日期>a.日期)
union all
select * from cte