通过platform和semver抓取group的两条最新记录

Grab two latest records of group by platform and semver

对于 platformsemver 的每一对,我都在尝试获取第二个最新记录,以此来始终支持从以前的应用程序版本到最新版本。

这是我的架构:

id, platform, semver, name

一些示例数据:

我想查询 return:

papapal, ios,     1.0.2
papapal, android, 1.0.2
foobar,  ios,     1.4.0
foobar,  android, 1.4.0

注意它不是最新记录,而是第二个最新记录。

我可以使用 semver 进行排序,但是每个应用程序的最新排名第二让我很困惑。

SELECT id, semver
FROM   app_versions
ORDER  BY string_to_array(semver, '.')::int[];

感谢任何帮助!

如果点之间的数字始终只有一位,您可以使用window函数,如下所示:

select platform, name, semver
from (
    select
        t.*,
        row_number() over(partition by platform, name order by semver desc) rn
    from mytable t
) t
where rn = 2

另一方面,如果您有像 '1.12.2' 这样的版本号(大于 '1.2.1'),那么您确实可以将它们转换为整数数组进行排序:

select platform, name, semver
from (
    select
        t.*,
        row_number() over(partition by platform, name order by string_to_array(semver, '.')::int[] desc) rn
    from mytable t
) t
where rn = 2