我需要创建一个只返回特定列中具有最小值的行的查询。
我有这个结果(例子):
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.
答案 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