SQL子查询 - 选择具有最大JobValue的JobID

时间:2009-08-10 22:23:42

标签: sql-server sql-server-2005 sql-server-2008 sql

这似乎很容易,但我画的是一片空白。

Select * from 
....
inner join 
  (
   select JobsID, Value from Jobs where Value **is the highest**
  ) as MaxJob on MaxJob.CustID = A.CustID

inner join
  (
   select other information based upon MaxJob.JobID
  ) as OtherStuff

是否有一种很好的方法让第一个子查询为我提供具有最大值的作业的作业ID?

谢谢......这看起来很简单,我确信我忽略了一些非常基本的东西。其中一天......

编辑:由于这个问题有点含糊不清,我写了一个更详细的问题here(因为这个问题得到了正确回答)。

5 个答案:

答案 0 :(得分:2)

如果您想要具有最高值的单个JobId:

SELECT JobId FROM Jobs WHERE Value = SELECT MAX(Value) FROM Jobs

但是,如果所有具有相同的值,那么可能会给你多个JobIds。所以,假设你不想那样,我可能会这样做:

SELECT MAX(JobId) as JobId FROM Jobs WHERE Value = SELECT MAX(Value) FROM Jobs

答案 1 :(得分:2)

Select top 1 JobId, Value from Jobs order by Value desc

这可能会导致比max(Value)更差的性能,但代码更少

答案 2 :(得分:1)

是的,你忽略了一些东西:SQL Server 2005及更高版本中出色的新语言功能!特别是像row_number()这样的分析函数和非常酷的CROSS APPLY join。

row_number解决了第一个问题(为给定的其他东西选择“最高”的东西):

with Ranked(a,b,c,d,rk) as (
  select T1.a,T2.b,T2.c,T2.d,
    row_number() over (
      partition by T1.a
      order by T2.x desc
    )
  from T1 join T2 on someCondition
)
  select a,b,c,d
  from Ranked
  where rk = 1;

CROSS APPLY解决了第二个问题 - 创建一个“基于MaxJob.JobID的表源”:

select *
from tableOrJoin
cross apply (
  select stuff
  from elsewhere
  where something = tableOrJoin.JobID
) as A

换句话说,它允许您通过使用右侧表源定义中左侧表源的列值来进行“相关连接”。

如果您有特定问题,请提供更具体的信息。我怀疑您可以在解决方案中使用这两个新功能。

答案 3 :(得分:0)

select max(JobId), value from jobs where...

编辑:我的错误我误解了这个问题,可能工作

select jobid, max(value) from jobs....

答案 4 :(得分:0)

SELECT j.JOBID,MAX(Value)OVER(由j.Value PARTITION按j.JOBID排序)为max_val,s.foobar 来自乔布斯j INNER JOIN SomeOtherTable s ON(s.jobid = j.jobid) 在哪里booya = win

我怀疑这可能毫无意义,因为我不知道你的桌子:D

但要学会过分和分裂的力量。学习它,爱它。