[英]How to query and filter the minimum value in one column while keeping the other columns in 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.