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
。首先找到每个 Name
的 min
顺序并将结果加入原始 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]
我需要创建一个查询,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
。首先找到每个 Name
的 min
顺序并将结果加入原始 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]