22,210
社区成员
发帖
与我相关
我的任务
分享
select id,name,rank() over(partition by name order by id)cur_rank from test;
select id,name,count(*)over(partition by name ) sum_rank from test;
select m.id,m.name from
(select id,name,rank() over(partition by name order by id) cur_rank from test) m,
(select name,round(count(id)*0.5,1) need_rank from test group by name) n
where m.name=n.name and m.cur_rank<=n.need_rank
order by m.name,id
select m.id,m.name from
(select id,name,rank() over(partition by name order by id) cur_rank from test) m,
(select name,round(count(id)*0.5,0) need_rank from test group by name) n
where m.name=n.name and m.cur_rank<=n.need_rank
order by m.name,id
create table #(id int identity,name varchar(10))
insert into # select 'a'
insert into # select 'a'
insert into # select 'a'
insert into # select 'a'
insert into # select 'b'
insert into # select 'b'
insert into # select 'b'
insert into # select 'b'
insert into # select 'd'
insert into # select 'd'
select * from # a
where id in (select top 50 percent id from # where name=a.name order by id)
drop table #
/*
id name
----------- ----------
1 a
2 a
5 b
6 b
9 d
(5 row(s) affected)
*/
declare @a table (id int identity,name varchar(10))
insert into @a select 'a'
insert into @a select 'a'
insert into @a select 'a'
insert into @a select 'a'
insert into @a select 'b'
insert into @a select 'b'
insert into @a select 'b'
insert into @a select 'b'
insert into @a select 'd'
insert into @a select 'd'
select aa.id,aa.name from
(select *,(select count(1) from @a where name=a.name and id<=a.id) idd from @a a)aa
inner join
(select name,count(1)/2 num from @a group by name)bb
on aa.name=bb.name
where idd<=num
--result
/*
id name
----------- ----------
1 a
2 a
5 b
6 b
9 d
*/
create table #(id int identity,name varchar(10))
insert into # select 'a'
insert into # select 'a'
insert into # select 'a'
insert into # select 'a'
insert into # select 'b'
insert into # select 'b'
insert into # select 'b'
insert into # select 'b'
insert into # select 'd'
insert into # select 'd'
select * from # a
where (select count(1) from # where name=a.name and id <a.id)<((select count(1) from # where name=a.name )/2)
/*
id name
----------- ----------
1 a
2 a
5 b
6 b
9 d
(所影响的行数为 5 行)
*/