SQL选择最低值,分组依据,其他字段

时间:2016-05-10 23:10:25

标签: sql sql-server

我在编写查询时遇到问题,该查询在找到另一列的最小值后给了我其他字段。我试过这个:

Select WorkOrder, min(Job), Details
From Jobs
Group by WorkOrder

但它不起作用。

这为我提供了WorkOrder的最低职位数列表:

Select WorkOrder, min(Job)
From Jobs
Group by WorkOrder

我想要具有最低职位编号的订单项的详细信息。我做错了什么?

6 个答案:

答案 0 :(得分:0)

您可以尝试此查询

Select WorkOrder, min(Job), Details
From Jobs
Group by WorkOrder, Details

答案 1 :(得分:0)

你应该在你的条件中添加min(),就像这样

Select * From Jobs Where Job in
(Select min_job From (Select WorkOrder ,min(Job) as min_job From Jobs
Group by WorkOrder)
)

答案 2 :(得分:0)

当您使用GROUP BY子句时,select语句中的所有内容都必须是聚合函数(如min,max,ect)或必须包含在GROUP BY子句中。详细信息未包含在GROUP BY子句中,因此该语句将无法编译。如果在GROUP BY子句中包含Details,您将获得WorkOrder和Details的每个组合的min(作业),这可能不是您想要的。

有几种方法可以解决这个问题。 IMO最简单的方法是选择你的min(作业)和Workorder,然后将结果加入到jobs表中并选择细节。要执行此操作,您的作业表必须具有唯一的主键。

SELECT
minWorkOrder.WorkOrder
minWorkOrder.MinJob
Jobs.Details
FROM
(Select Key, WorkOrder, min(Job) as MinJob
From Jobs
Group by Key, WorkOrder) AS minWorkOrder
INNER JOIN Jobs
ON Jobs.Key = minWorkOrder.Key 

如果您的桌子没有唯一的密钥,那么事情会变得更加棘手。在此查询的范围内,可能安全地假设min(Job)和WorkOrder的每个组合都是唯一的。你可以加入这两个领域,你应该得到正确的答案。

SELECT
minWorkOrder.WorkOrder
minWorkOrder.MinJob
Jobs.Details
FROM
(Select WorkOrder, min(Job) as MinJob
From Jobs
Group by WorkOrder) AS minWorkOrder
INNER JOIN Jobs
ON Jobs.Job = minWorkOrder.MinJob AND Jobs.WorkOrder = minWorkOrder.WorkOrder

答案 3 :(得分:0)

你应该试试这个:

SELECT WorkOrder, Details 
from Jobs
where Job IN (SELECt min(Job), WorkOrder from Jobs GROUP BY WorkOrder);

答案 4 :(得分:0)

我和我所在部门的工程师一起工作,提供了这个有效的答案:

Select A.WorkOrder, A.Job, A.Details 
From(Select WorkOrder, Job, Details, Row_Number() 
     over( Partition by WorkOrder Order by Job ASC) as Num
     From Jobs)A 
     where A.Num = 1

答案 5 :(得分:0)

with cte as
(
select workorder,Job, Details, rank() over (partition by workorder order by job asc) as rnk 
from
Jobs
)
select workorder,Job, Details from cte
where rnk = 1

在这里,我们按照每个工作订单的升序对作业列中的值进行排名。最后WHERE子句rnk = 1仅获取每个工作订单的最小值的作业。如果工作订单具有多个具有相同值的作业,则RANK()将为它们分配相同的等级。因此,如果工作订单具有多个具有最小值的作业,则将返回所有这些作业。