SQL | Return 最小值 |动态多行

SQL | Return MIN values | multiple rows dynamically

我需要创建一个查询,returns 仅查询特定列中具有最小值的行。

我有这个结果(示例):

Name  |  Description  | Order
-----------------------------
Name1 |  A            | 1
Name1 |  B            | 2
Name1 |  C            | 3
Name2 |  A            | 1
Name2 |  B            | 2
Name2 |  C            | 3

我想得到这个结果:

Name  |  Description  | Order
-----------------------------
Name1 |  A            | 1
Name2 |  A            | 1

基本上,我只需要 select 列 order.

中具有最小值的行

我遇到了 查询 A:

这样的查询
Select Top 1 *
From table1
Where Name = 'Name1'
Order by Order

查询B:

Select *
From table1
Where Name = 'Name1'
 and order = (Select min(Order)
              From table1
              Where Name = 'Name1')

我需要的是在单个查询中具有为多个名称返回行的能力,而不必针对每个名称进行查询。有什么方法可以将属性值传递给 Query B?

示例中的子查询

有哪些选择?

平台是SQL Server 2012。

如果您想使用简单的子查询,您就完成了第二个查询:

Select *
From table1 t1
WHERE [order] = (Select min([Order])
             From table1
             Where Name = t1.Name)

您还可以使用分区函数为每个组查找 "first" 记录:

SELECT Name, Description, [Order] FROM
    (SELECT *,
        ROW_NUMBER() OVER(ORDER BY [Order] PARTITION BY Name) RowNum
     FROM Table1 
    ) A
WHERE RowNum = 1

更好的方法

select * 
from
(
select row_number()over(partition by Name order by [Order] ASC) as Rn,* 
from yourtable
) A
Where RN = 1

或使用INNER JOIN。首先找到每个 Namemin 顺序并将结果加入原始 table

SELECT * 
FROM   table1 A 
       INNER JOIN (SELECT [order] = Min(order), 
                          name 
                   FROM   table1 
                   WHERE  name = t1.name 
                   GROUP  BY name) B 
               ON A.[order] = B.[order] 
                  AND A.name = B.name 

使用 Min() 聚合与 partition by window 函数

select * 
from
(
select Min([Order])over(partition by Name) as min_order,* 
from yourtable
) A
Where min_order = [Order]