根据特定字符串的优先级选择查询

时间:2017-08-03 13:54:36

标签: sql sql-server

我有一张桌子:

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和费用进行分组,但只需要一行。另外,如果约翰不在场,我想在选择时优先选择约翰,并且任意随意排一行。 (对于id = 3,任何Jen或Mike都可以接受)

期望的结果:

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

我尝试使用Rank,但如果没有约翰,我无法区分ids。

请帮助

谢谢!

2 个答案:

答案 0 :(得分: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 :(得分: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