簡體   English   中英

SQL子查詢-選擇具有最大JobValue的JobID

[英]SQL Sub-query — Select JobID with a maximum JobValue

這似乎是一件容易的事,但我正在空白。

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?

謝謝...這似乎很簡單,我敢肯定我忽略了一些非常基本的內容。 那些日子中的一天...

編輯:由於這個問題是有點曖昧,我已經寫了一個更詳細的問題在這里 (因為這個問題被回答正確)。

如果您希望單個JobId具有最高的價值:

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

但是,如果它們都具有相同的值,則可能會給您多個JobId。 因此,假設您不希望這樣做,我可能會這樣做:

SELECT MAX(JobId) as JobId FROM Jobs WHERE Value = SELECT MAX(Value) FROM Jobs
Select top 1 JobId, Value from Jobs order by Value desc

這可能會導致性能比max(Value)差,但是代碼更少

是的,您忽略了一些東西:SQL Server 2005和更高版本中出色的新語言功能! 特別是像row_number()這樣的分析函數和非常酷的CROSS APPLY聯接在一起。

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

換句話說,它允許您在右側表源的定義中使用左側表源中的列值進行“關聯聯接”。

如果您有特定問題,請提供更多具體信息。 我懷疑您可能可以在解決方案中同時使用這兩個新功能。

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

編輯:我不好我讀錯了問題,這可能會工作

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

從作業j INNER JOIN SomeOtherTable s ON(s.jobid = j.jobid)中選擇j.JOBID,MAX(Value)OVER(按j.Value PARTITION由j.JOBID排序)作為max_val,s.foobar

我懷疑這可能毫無意義,因為我不知道您的表:D

但是,學習重疊和分區的能力。 學習,愛它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM