在SQL中,如何选择列的最小值和其他列的组?

时间:2017-04-04 13:35:08

标签: sql database select group-by

我在下面有一个查找表:

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),[ref](指向另一个表中其他实体的引用id)和[order](告诉顺序)参考,较小的订单意味着更高的优先级。)

我的期望是,对于每个ID,只选择一个具有最小顺序的ref。我的代码是(通过关注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

您能告诉我我的代码有什么问题吗?我该如何实现目标?

3 个答案:

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

或使用完全按照您所声明的方式执行的子查询,   "对于每个ID,只选择一个具有最小订单的参考"

Select * from tab_lkp t
Where order = 
    (Select Min(order) from tab_lkp 
     where Id = t.Id)

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