Выберите строки с одинаковым значением в одном столбце и разными в другом - PullRequest
1 голос
/ 27 марта 2020

У меня есть таблица с данными нескольких версий. Каждая строка имеет идентификатор и версию. Мне нужно выбрать строки с более высокой версией, но не все строки имеют одинаковую версию. Например:

    str_identifier | version              | other_data
------------------ |---------------------
abcd               | 1
abcd               | 3
abcd               | 3
qqqq               | 2
qqqq               | 4
rrrr               | 1
rrrr               | 1

Мне нужно выбрать строки abcd с версией 3, строку qqqq с версией 4 и строки rrrr с версией 1. Каждый str_identifier имеет несколько записей для каждой версии, поэтому они повторил.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 27 марта 2020

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

SELECT v.*
FROM versions v
JOIN (SELECT str_identifier, MAX(version) AS version
      FROM versions
      GROUP BY str_identifier) m ON m.str_identifier = v.str_identifier AND m.version = v.version
0 голосов
/ 27 марта 2020

Похоже, что rank() должен сделать трюк:

SELECT *
FROM   (SELECT *, RANK() OVER (PARTITION BY str_identifier ORDER BY version DESC) AS rk
        FORM   versions)
WHERE  rk = 1
0 голосов
/ 27 марта 2020

Один метод является коррелированным подзапросом:

select v.*
from versions v
where v.version = (select max(v2.version)
                   from versions v2
                   where v2.str_identifier = v.str_identifier
                  );

Вы также можете использовать оконные функции:

select v.*
from (select v.*,
             row_number() over (partition by str_identifier order by version desc) as seqnum
      from versions v
     ) v
where seqnum = 1;
...