SQL |返回MIN值|动态多行

时间:2016-01-04 17:16:25

标签: sql sql-server sql-server-2012 subquery

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

我有这个结果(例子):

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

基本上,我只需要选择顺序列中具有最小值的行。

我坚持使用查询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')

我需要的是在单个查询中,为多个名称返回行的能力,而不是每个名称都要进行查询。有没有办法,在查询B 示例中将属性值传递给子查询?

有哪些替代方案?

该平台是SQL Server 2012.

2 个答案:

答案 0 :(得分:2)

如果要使用简单的子查询,则关闭第二个查询:

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

答案 1 :(得分:2)

更好的方法

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

或使用INNER JOIN。首先找到每min的{​​{1}}订单,然后将结果加回原始表

Name

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