Select 行在一列中具有相同的值而在其他列中具有不同的值

Select rows that has the same value in one column and different in other

我有一个 table 有多个版本的数据。每行都有一个标识符和一个版本。我需要 select 具有更高版本的行,但并非每一行都具有相同的版本。例如:

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

我需要 select 版本 3 的行 abcd,版本 4 的行 qqqq 和版本 1 的行 rrrr。每个 str_identifier 每个版本都有多个记录,这就是为什么他们重复。

提前致谢。

一种方法是相关子查询:

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

您还可以使用 window 函数:

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;

听起来 rank() 应该可以解决问题:

SELECT *
FROM   (SELECT *, RANK() OVER (PARTITION BY str_identifier ORDER BY version DESC) AS rk
        FORM   versions)
WHERE  rk = 1

您可以使用 JOIN 派生的最大版本号 table 来获取具有该最大值的所有行:

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