我在下面有一个查找表:
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
您能告诉我我的代码有什么问题吗?我该如何实现目标?
答案 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