2015-10-21 2 views
0

У меня есть этот запросSQL, только одна строка, возвращаемая для каждого JobId

SELECT 
    schedule.JOB_NUMBER, max(schedule_milestone.actual_start_date), milestone.milestone_name 
FROM 
    schedule 
    inner join 
    schedule_milestone on (schedule.schedule_id = schedule_milestone.schedule_id) inner join 
    milestone on (milestone.milestone_id = schedule_milestone.milestone_id) 
--where schedule.job_number = '024MGV002' using this for testing 
group by schedule.job_number, milestone.milestone_name 

я вернуть Номер_задания, MaxDate и имя вехи.

Что я хочу вернуть, это номер задания, MaxDate и имя этапа, но мне нужна только одна строка для каждого номера задания. Я хочу, чтобы эта веха имела самую последнюю дату.

Таким образом, номер задания 1234 имеет 4 разных этапа. Я хочу указать номер задания, дату и имя веха для вехи с максимальной датой.

+0

Использования row_number() или rank() для фильтрации только одной записи. –

+0

@anwaar_hell. Вы должны спросить, что такое rdbms OP. Например, mysql не имеет этих функций. –

+0

@JuanCarlosOropeza: но MySQL более или менее единственная СУБД, которая не поддерживает [современный SQL] (http://use-the-index-luke.com/de/blog/2015-02/modern-sql) –

ответ

0
select * from (
Select JOB_NUMBER,dt,milestone_name,row_number() over (partition by JOB_NUMBER order by dt desc) as rownm 
from (
SELECT 
    schedule.JOB_NUMBER as JOB_NUMBER, milestone.milestone_name, max(schedule_milestone.actual_start_date) as dt 
FROM 
    schedule schedule 
    inner join 
    schedule_milestone schedule_milestone 
    on (schedule.schedule_id = schedule_milestone.schedule_id) 
    inner join 
    milestone milestone on 
    (milestone.milestone_id = schedule_milestone.milestone_id) 
group by schedule.job_number, milestone.milestone_name)) 
where rownm=1; 
+0

'qualify' является нестандартным SQL. Какая СУБД поддерживает это? –

+0

@a_horse_with_no_name ..it находится в teradata и oracle11g –

+1

У Oracle этого нет. –

1

Если вы не используете MySQL вы можете использовать функцию ROW_NUMBER()

В противном случае

SELECT 
     S.JOB_NUMBER 
    , SM.actual_start_date 
    , M.milestone_name 
FROM schedule S 
JOIN schedule_milestone SM 
    ON S.schedule_id = SM.schedule_id 
JOIN milestone M 
    ON M.milestone_id = SM.milestone_id 
WHERE SM.actual_start_date = ( SELECT MAX(SM.actual_start_date) 
           FROM schedule iS 
           JOIN schedule_milestone iSM 
            ON iS.schedule_id = iSM.schedule_id 
           JOIN milestone iM 
            ON iM.milestone_id = iSM.milestone_id 
           WHERE iS.job_number = S.job_number 
          ) 

Обратите внимание, это есть проблема, если несколько этапов совместно же start_date для того же job_number

+0

Кажется, что это работает. Пришлось изменить первый оператор WHERE на HAVING. Что мне делать, если есть несколько этапов, которые имеют одинаковые начальные_данные и job_number? –

+0

Вам нужно что-то еще, чтобы сказать разницу, чтобы вы может выбрать 'MAX'. Обычно используйте' TIME STA MP' вместо даты. –

Смежные вопросы