【问题标题】:In SQL, how to select minimum value of a column and group by other columns?在 SQL 中,如何选择列的最小值并按其他列分组?
【发布时间】:2017-08-29 17:57:31
【问题描述】:

我在下面有一个查找表:

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

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

【问题讨论】:

  • 标记 DBMS 以获得更好的响应
  • 另外,按ref分组,所以如果一个id有多个ref falues,它会全部返回。请显示预期输出

标签: sql database select group-by


【解决方案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;

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      从 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-03
        • 2014-09-15
        • 1970-01-01
        • 2015-11-15
        • 1970-01-01
        • 2022-01-01
        • 2020-07-11
        • 2021-09-09
        相关资源
        最近更新 更多