2017-08-03 238 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