MS Access SQL: получить наборы данных с самыми высокими версиями и ревизиями - PullRequest
0 голосов
/ 28 октября 2018

У меня есть таблица базы данных с (для этого вопроса) тремя столбцами:

  1. Идентификатор документа
  2. Revison
  3. Версия

В каждом документе есть 1..n ревизий, а в каждой ревизии - 1..n версий.

Каков мой оператор SQL для всех документов в их наивысших ревизиях и наивысших версиях этих ревизий?

Doc Title   Revision   Version    Should be selected
Dok 1       01         01
Dok 1       01         02
Dok 1       01         03         
Dok 1       02         01
Dok 1       02         02         * Because Rev 02 / V02 is the highest
Dok 2       01         01
Dok 2       02         01
Dok 2       03         01         * Because Rev 03 / V01 is the highest

D

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Если предположить, что имя таблицы Table1 (изменить на подходящий), я бы предложил следующее:

SELECT 
    Table1.[Document ID],
    Table1.Revision,
    Max(Table1.Version) As Version
FROM
    Table1 INNER JOIN 
    (
        SELECT 
            Table1.[Document ID], 
            Max(Table1.Revision) AS Rev
        FROM 
            Table1
        GROUP BY 
            Table1.[Document ID]
    ) DocRev
    ON 
    Table1.[Document ID] = DocRev.[Document ID] AND 
    Table1.Revision = DocRev.Rev
GROUP BY 
    Table1.[Document ID],
    Table1.Revision

Здесь вложенный запрос SELECT сначала получает наибольшее значение Revision для каждого Document ID:

SELECT 
    Table1.[Document ID], 
    Max(Table1.Revision) AS Rev
FROM 
    Table1
GROUP BY 
    Table1.[Document ID]

Затем INNER JOIN передается в исходную таблицу, чтобы получить все записи Version для каждого максимального значения Revision, при этом максимальная запись Version наконец выводится в результат.

0 голосов
/ 28 октября 2018

Если у вас есть уникальный идентификатор для каждой строки (что я рекомендую для всех таблиц), то для этого следует использовать коррелированный подзапрос:

select d.*
from documents as d
where d.pk = (select top (1) d2.pk
              from documents as d2
              where d2.documentid = d.documentid
              order by d2.version desc, d2.revision desc, d2.pk desc
             );

Без первичного ключа вы можете сделать это путем объединения значений:

select d.*
from documents as d
where d.version & "-" & d.revision =
          (select top (1) d2.version & "-" & d2.revision
           from documents as d2
           where d2.documentid = d.documentid
           order by d2.version desc, d2.revision desc
          );
0 голосов
/ 28 октября 2018

вы можете использовать функцию максимального агрегирования и группировать по объединению с подзапросом

    select id,  max_ver, max(revision)
    from my_table  m
    inner join (
        select ID, max(version) max_ver
        from my_table
        group by id  
    ) t on t.id = m.id and t.max_ver = m.version
    group by  id,  max_ver
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...