Возврат определенных строк путем группировки столбцов

0

Я застрял в SQL-запросе, идея в том, что у меня есть база данных, где я храню все документы с каждой version(revisionNumber) документа version(revisionNumber) и т.д. То, что я хочу достичь, это то, что я хочу получить доступ только к этим документам с последними revisionNumber.

|  id | title               | documentForm | revisionNumber | effectiveDate |
| --: | ------------------- | -------------| -------------: | :------------ |
|   1 | Event Calendar      | SOP-CL       |            1.0 | 2011-02-02    |
|   2 | Event Calendar      | SOP-CL       |            2.0 | 2012-12-16    |
|   3 | Event Calendar      | SOP-CL       |            3.0 | 2014-02-15    |
|   4 | Event Calendar      | SOP-CL       |            4.0 | 2014-08-01    |
|   5 | Event Calendar      | SOP-CL       |            5.0 | 2016-09-12    |
|   6 | Event Calendar      | SOP-CL       |            6.0 | 2018-09-11    |
|   7 | Software development| SOP-DEV      |            1.0 | 2015-11-25    |
|   8 | Granting and...     | SOP-GRA      |            1.0 | 2014-08-04    |
|   9 | Granting and...     | SOP-GRA      |            2.0 | 2015-12-07    |
|  10 | Granting and...     | SOP-GRA      |            3.0 | 2018-03-26    |

И здесь вы можете увидеть результат, который мне нужно получить после запроса:

|  id | title               | documentForm | revisionNumber | effectiveDate |
| --: | ------------------- | ------------ | -------------: | :------------ |
|   6 | Event Calendar      | SOP-CL       |            6.0 | 2018-09-11    |
|   7 | Software development| SOP-CL       |            1.0 | 2015-11-25    |
|   3 | Granting and...     | SOP-GRA      |            3.0 | 2018-03-26    |

Я искал в google и обнаружил, что это можно сделать путем группировки - например, documentForm и возврата MAX(revisionNumber) но я не получаю правильный id строки и effectiveDate. Наверное, я просто не использую их правильно.

  • 0
    Какая версия MySQL?
  • 0
    MySQL версия 5.1.73
Показать ещё 1 комментарий
Теги:

3 ответа

2
Лучший ответ

использовать согласованный подзапрос

select * from table1 t1
where revisionNumber in ( select max(revisionNumber) 
   from
   table1 t2 where t1.title=t2.title and t1.documentForm=t2.documentForm
   group by t2.title,t2.documentForm
   )
  • 0
    Спасибо, я пытался сделать запрос аналогичным образом, но не сработал, но ваше решение работает сейчас! Спасибо!!
  • 0
    @ Сангсом если работает то прими ответ пожалуйста
2

Вы можете попытаться использовать подзапрос в предложениях.

Схема (MySQL v5.6)

CREATE TABLE t (
  title varchar(50),
  documentForm varchar(50), 
  effectiveDate date,
  revisionNumber int

);

insert into t values ('vent Calendar','SOP-CL','2011-02-02',1.0);
insert into t values ('vent Calendar','SOP-CL','2012-12-16',2.0);
insert into t values ('vent Calendar','SOP-CL','2014-02-15',3.0);
insert into t values ('vent Calendar','SOP-CL','2014-08-01',4.0);
insert into t values ('vent Calendar','SOP-CL','2016-09-12',5.0);
insert into t values ('vent Calendar','SOP-CL','2018-09-11',6.0);
insert into t values ('oftware development ','SOP-DEV','2015-11-25',1.0);  
insert into t values ('ranting and..','SOP-GRA','2014-08-04',1.0);
insert into t values ('ranting and..','SOP-GRA','2015-12-07',2.0);
insert into t values ('ranting and..','SOP-GRA','2018-03-26',3.0);

Запрос №1

SELECT * 
FROM t t1
WHERE revisionNumber  = (
   select max(tt.revisionNumber)
   from t tt
   WHERE t1.documentForm = tt.documentForm
);

| title                | documentForm | effectiveDate | revisionNumber |
| -------------------- | ------------ | ------------- | -------------- |
| vent Calendar        | SOP-CL       | 2018-09-11    | 6              |
| oftware development  | SOP-DEV      | 2015-11-25    | 1              |
| ranting and..        | SOP-GRA      | 2018-03-26    | 3              |

Посмотреть на DB Fiddle

1

Имейте подзапрос, который делает GROUP BY чтобы возвращать каждый documentForm с наивысшей версией versionNumber. JOIN к этому результату:

select t1.*
from tablename t1
join (select documentForm, version(revisionNumber) as maxrevisionNumber
      from tablename
      group by documentForm) t2
    on  t1.documentForm = t2.documentForm
    and t1.revisionNumber = t2.maxrevisionNumber

Ещё вопросы

Сообщество Overcoder
Наверх
Меню