繁体   English   中英

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

[英]In SQL, how to select minimum value of a column and group by other columns?

我有一个查找表如下:

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的回答 ):

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

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

你通常会使用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;

或者通过使用完全符合您所要求的子查询,“对于每个ID,只选择一个具有最小顺序的ref”

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

从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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM