2017-04-04 50 views
1

我有下面的查找表:在SQL中,如何通过其他列选择列和组的最小值?

id ref order 
1 6 0 
2 6 0 
3 7 0 
5 34 0 
6 33 0 
6 255 1 
9 12 0 
9 80 1 
12 7 0 
12 76 1 
13 10 0 
15 12 0 
16 6 0 
16 7 1 
17 6 1 
17 63 0 
18 7 0 
19 7 1 
19 75 0 
20 6 0 
20 63 1 
在查找表(tab_lkp)

所以,它具有柱[ID](实体的ID),[参考文献](基准ID指向其他实体在另一个表中)和[顺序](告诉参考顺序,较小的顺序意味着较高的优先级)。

我的期望是,对于每个ID,只选择一个具有最小顺序的参考。我的代码是(按照Phil's answer):

select id 
,  ref 
,  min_order = min(order) 
from [dbo].[tab_lkp] 
group by id, ref 
order by id, ref 

但代码不为我工作,结果还是包含每个ID的多个记录:

id ref order 
1 6 0 
2 6 0 
3 7 0 
5 34 0 
6 33 0 
6 255 1 
9 12 0 
9 80 1 
12 7 0 
12 76 1 
13 10 0 
15 12 0 
16 6 0 
16 7 1 
17 6 1 
17 63 0 
18 7 0 
19 7 1 
19 75 0 
20 6 0 
20 63 1 

可否请你让我知道我的代码有什么问题?我该如何实现自己的目标?

+1

标记DBMS以获得更好的响应 – JohnHC

+0

同样,按'ref'分组,所以如果一个id有多个'ref' falues,它将返回所有这些。请显示预期的输出 – JohnHC

回答

1

从ANSI SQL的方法:

select x2.id, x2.ref, x2.order 
from MyTable x2 
inner join 
(
    select id, min(order) as min_order 
    from MyTable 
    group by id 
) x1 
on x1.id = x2.id 
and x1.min_order = x2.order 
1

你通常会做此使用row_number()

select t.* 
from (select t.*, row_number() over (partition by id order by ref) as seqnum 
     from [dbo].[tab_lkp] t 
    ) t 
where seqnum = 1; 
1

或使用不正是你的国家,你想有一个子查询, “为每一标识,只有一个裁判用最小的顺序是选择了”

Select * from tab_lkp t 
Where order = 
    (Select Min(order) from tab_lkp 
    where Id = t.Id) 
相关问题