2017-08-03 236 views
3

選擇查詢我有一個表:基於優先級一定字符串

ID|Expense|Name 
1|1000|John 
1|1000|Roger 
1|1000|Megan 
2|500|Sally 
2|500|John 
3|700|Jen 
3|700|Mike 

我想通過組ID和代價,而是要一個單行。另外,如果約翰不在場,我想在選擇John的同時選擇任意一行。 (對於ID = 3任仁和麥克是可以接受的)

期望的結果:

ID|Expense|Name 
1|1000|John 
2|500|John 
3|700|Jen 

我試着用Rank,但我不能夠區分對IDS沒有約翰。

請幫忙

謝謝!

+2

當溜溜你說「隨機」一行,你是否期望每次運行查詢時都會改變輸出(假設它是非John組)? –

+0

我不介意它是否更改 –

+0

然後通過@vkp查看答案低於 –

回答

6

這可以用row_number完成,使用case表達式進行優先排序。

select id,expense,name 
from (
select t.*,row_number() over(partition by id order by case when name='John' then 1 else 2 end) as rnum 
from tbl t 
) t 
where rnum=1 
+1

看起來不錯!他想以ID和費用分組,不應該由Id,費用劃分。 – EoinS

1

,沒有額外的字段的另一種選擇是使用WITH TIES子句

Declare @YourTable Table ([ID] int,[Expense] int,[Name] varchar(50)) 
Insert Into @YourTable Values 
(1,1000,'John') 
,(1,1000,'Roger') 
,(1,1000,'Megan') 
,(2,500,'Sally') 
,(2,500,'John') 
,(3,700,'Jen') 
,(3,700,'Mike') 

Select Top 1 with ties * 
from @YourTable 
Order By Row_Number() over (Partition By ID,Expense Order By NullIf(Name,'John')) 

返回

ID Expense Name 
1 1000 John 
2 500  John 
3 700  Jen