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

一个SQL分类的问题 求高手
下面是我查询出来的

rowid name age state
------------------------
1 张三 18 start
2 张三 18 end
3 李四 20 start
4 王五 22 end
5 王五 22 start
6 ...
------------------------
只要有end 那必然存在一个状态为 start的 记录条件是除了state 其他都相同的 也就是张三王五 那种情况

现在我怎么才能保留已结束的 去掉与之对应的那些已开始的 李四那种情况默认保留

条件要怎么加呢

理想效果如下


rowid name age state
------------------------
1 张三 18 start
2 张三 18 end
3 李四 20 start
4 王五 22 end
5 王五 22 start
6 ...
------------------------


------解决方案--------------------
delete tb 
where state = 'start'
and exists(select 1 from tb as A where A.name=tb.name and A.state='end')
------解决方案--------------------
select * from tb as A
where A.state='end'
or (A.state='start' and not exists(select 1 from tb where name=A.name and state='end'))
------解决方案--------------------
select rowid,name,age,state from
(select *,RANK() over (partition by name order by [state]) as row from test1)
a where row=1
------解决方案--------------------
SQL code
create table test1(
rowid int ,name varchar(20) ,age int, [state] varchar(10))
insert into test1 values(1 ,'张三', 18, 'start')
insert into test1 values(2 ,'张三', 18, 'end')
insert into test1 values(3 ,'李四', 20, 'start')
insert into test1 values(4 ,'王五', 22, 'end')
insert into test1 values(5 ,'王五', 22, 'start')
select rowid,name,age,state from
(select *,RANK() over (partition by name order by [state]) as row from test1)
a where row=1
3    李四    20    start
4    王五    22    end
2    张三    18    end