Подзапрос SQL - выберите JobID с максимальным значением JobValue - PullRequest
1 голос
/ 11 августа 2009

Это кажется легкой вещью, но я рисую пробел.

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

Есть ли хороший способ, чтобы этот первый подзапрос дал мне идентификатор задания для задания с максимальным значением?

Спасибо ... это кажется легким, и я уверен, что пропускаю что-то очень элементарное. Один из тех дней ...

Редактировать: из-за того, что этот вопрос был несколько двусмысленным, я написал гораздо более подробный вопрос здесь (поскольку на этот вопрос был дан правильный ответ)

Ответы [ 5 ]

2 голосов
/ 11 августа 2009
Select top 1 JobId, Value from Jobs order by Value desc

Это может привести к худшей производительности, чем max (Value), но меньше кода

2 голосов
/ 11 августа 2009

Если вам нужен единственный 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
1 голос
/ 11 августа 2009

Да, вы что-то упускаете: отличные новые языковые функции в 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

Другими словами, он позволяет вам иметь «коррелированное соединение», используя значение столбца из левого источника таблицы в определении правого источника таблицы.

Если у вас есть конкретный вопрос, пожалуйста, дайте более конкретную информацию. Я подозреваю, что вы можете использовать обе эти новые функции в своем решении.

0 голосов
/ 11 августа 2009

ВЫБЕРИТЕ j.JOBID, MAX (значение) OVER (порядок по j.Value PARTITION по j.JOBID) как max_val, s.foobar С работы J ВНУТРЕННЕЕ СОЕДИНЕНИЕ SomeOtherTable s ON (s.jobid = j.jobid) ГДЕ БУЯ = победа

Я подозреваю, что это может не иметь смысла, потому что я не знаю ваших таблиц: D

Но УЗНАЙТЕ СИЛУ ПРЕОДОЛЕНИЯ И РАЗДЕЛЕНИЯ. УЧИТЕ, ЛЮБИТЕ.

0 голосов
/ 11 августа 2009
select max(JobId), value from jobs where...

Редактировать: мой плохой, я неправильно понял вопрос, это может работать

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