我有一张桌子:
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。
请帮助
谢谢!
答案 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