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]
我使用了斯坦利的解决方案。谢谢你,伙计。对于更复杂的情况,我会保留这个。