2011-12-20 61 views
0

编辑 - 重申我的需要,因为两个家伙的方式比我更容易误解我的问题,所以我需要使这个更好...SQL Server首先获得排名?

我有一个像下面的表。我需要选择“ison”列为1的第一组'sec1'行的所有行。因此,查询应该首先返回'bbb'行,但是如果我将所有行设置为ison = 0,然后使'ccc'行ison = 1,那么我会在结果集中得到两行'ccc'。任何人都可以帮助我与我的排名/顶部?使用MSSQL 2008.

create table #grp (sec1 varchar(4) , sec2 varchar(4) , ison bit) 
insert into #grp values ('aaa' , '001' , 0) 
insert into #grp values ('aaa' , '002' , 0) 
insert into #grp values ('bbb' , '001' , 1) 
insert into #grp values ('ccc' , '001' , 1) 
insert into #grp values ('ccc' , '001' , 1) 

Select * From 
(Select 
    sec1 , 
    sec2 , 
    ison , 
    RANK() Over (partition by sec1 order by sec1,sec2) as rowrank 
from #grp 
where ison=1 
) tmp 
where rowrank=1 

谢谢。

回答

2
create table #grp (sec1 varchar(4) , sec2 varchar(4) , ison bit) 
insert into #grp values ('aaa' , '001' , 0) 
insert into #grp values ('aaa' , '002' , 1) 
insert into #grp values ('bbb' , '001' , 1) 
insert into #grp values ('ccc' , '001' , 1) 
insert into #grp values ('ccc' , '001' , 1) 

SELECT * 
    FROM #grp 
WHERE sec1 = (
        Select TOP(1) sec1 
        From 
         (Select 
           sec1 , 
           sec2 , 
           ison , 
           RANK() Over (partition by sec1 order by sec1,sec2) as rowrank 
          from #grp 
          where ison=1 
         ) tmp 
        where rowrank=1 
        Order by sec1, Sec2 
       ) 
+0

如果我这样做:update #grp set ison = 0; update #grp set ison = 1 where sec1 ='aaa'然后运行你的select语句我只得到一行aaa,而不是两行。我需要帮助了解如何获取每个sec1组中的所有行,而不仅仅是第一个匹配的sec1组中的第一行。谢谢。 – Snowy 2011-12-20 19:20:23

+0

你可以尝试更新的答案吗? – Akhil 2011-12-20 19:32:08