读书人

一个SQL分类的有关问题 求高手

发布时间: 2012-06-01 16:46:36 作者: rapoo

一个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=13    李四    20    start4    王五    22    end2    张三    18    end 

读书人网 >SQL Server

热点推荐