2011-12-20 71 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