SQL: для каждого идентификатора отображать только наибольшее значение из другого столбца (не может группироваться по)

#mysql #sql

#mysql #sql

Вопрос:

У меня есть эта таблица здесь :

  --------- ---------- ------------ ------------ 
| idStep  |  idProj  | dateStart  | dateEnd    |
 --------- ---------- ------------ ------------ 
|       1 |        1 | 2011-07-01 | 2011-09-01 |
|       1 |        2 | 2012-05-01 | 2012-05-10 |
|       1 |        3 | 2011-11-01 | 2012-01-20 |
|       2 |        1 | 2011-09-02 | 2011-11-30 |
|       2 |        2 | 2012-05-11 | 2012-06-01 |
|       2 |        3 | 2012-01-21 | 2012-04-01 |
|       3 |        1 | 2011-12-01 | 2012-07-07 |
|       3 |        2 | 2012-06-02 | 2012-07-01 |
|       3 |        3 | 2012-04-02 | NULL       |
|       4 |        1 | 2012-07-08 | NULL       |
|       4 |        2 | 2012-07-01 | 2012-07-21 |
|       5 |        2 | 2012-07-22 | 2012-07-23 |
 --------- ---------- ------------ ------------ 
 

Мне нужно найти текущий шаг каждого проекта путем поиска наивысшего idStep каждого idProject без использования Group By, в котором я полностью застрял. Без GROUP BY я просто не могу туда попасть.

В принципе, вывод должен быть таким :

  --------- ---------- ------------ ------------ 
| idStep  |  idProj  | dateStart  | dateEnd    |
 --------- ---------- ------------ ------------ 
|       3 |        3 | 2012-04-02 | NULL       |
|       4 |        1 | 2012-07-08 | NULL       |
|       5 |        2 | 2012-07-22 | 2012-07-23 |
 --------- ---------- ------------ ------------ 
 

Я хочу использовать запрос, построенный следующим образом

 SELECT idProj,idStep
FROM table
WHERE idStep = (SELECT max(idStep) FOR EACH idProj)
 

Я знаю, что ДЛЯ КАЖДОГО не является SQL, я только пытаюсь сделать мою желаемую структуру запроса читаемой.

Ответ №1:

Вам нужен коррелированный подзапрос:

 SELECT idProj, idStep
FROM table t
WHERE t.idStep = (SELECT max(idStep)
                  FROM table t2
                  WHERE t2.idProj = t.idProj
                 );