Я застрял в 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
. Наверное, я просто не использую их правильно.
использовать согласованный подзапрос
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
)
Вы можете попытаться использовать подзапрос в предложениях.
Схема (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 |
Имейте подзапрос, который делает 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