SQL |返回最小值|动态多行

SQL |返回最小值|动态多行,sql,sql-server,sql-server-2012,subquery,Sql,Sql Server,Sql Server 2012,Subquery,我需要创建一个查询,只返回特定列中具有最小值的行 我有以下结果(示例): 我希望得到以下结果: Name | Description | Order ----------------------------- Name1 | A | 1 Name2 | A | 1 基本上,我只需要选择列顺序中具有最小值的行 我经常遇到类似于查询A的查询: Select Top 1 * From table1 Where Name = 'Name1' Ord

我需要创建一个查询,只返回特定列中具有最小值的行

我有以下结果(示例):

我希望得到以下结果:

Name  |  Description  | Order
-----------------------------
Name1 |  A            | 1
Name2 |  A            | 1
基本上,我只需要选择列顺序中具有最小值的行

我经常遇到类似于查询A的查询:

Select Top 1 *
From table1
Where Name = 'Name1'
Order by Order
Select *
From table1
Where Name = 'Name1'
 and order = (Select min(Order)
              From table1
              Where Name = 'Name1')
查询B

Select Top 1 *
From table1
Where Name = 'Name1'
Order by Order
Select *
From table1
Where Name = 'Name1'
 and order = (Select min(Order)
              From table1
              Where Name = 'Name1')
我需要的是在单个查询中,能够返回多个名称的行,而不必对每个名称进行查询。在查询B的示例中,是否有方法将属性值传递给子查询

有哪些替代方案


该平台是SQL Server 2012

如果要使用一个简单的子查询,那么第二个查询就结束了:

Select *
From table1 t1
WHERE [order] = (Select min([Order])
             From table1
             Where Name = t1.Name)
您还可以使用分区函数查找每个组的“第一条”记录:

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
或者使用
内部联接
。首先根据
Name
查找
min
顺序,并将结果连接回原始表

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()

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

我使用了斯坦利的解决方案。谢谢你,伙计。对于更复杂的情况,我会保留这个。