获取group by platform和semver的两条最新记录

Posted

技术标签:

【中文标题】获取group by platform和semver的两条最新记录【英文标题】:Grab two latest records of group by platform and semver 【发布时间】:2020-08-11 04:35:42 【问题描述】:

对于platformsemver 的每一对,我都试图获得第二条最新记录,以此来支持以前的应用程序版本到最新版本。

这是我的架构:

id, platform, semver, name

一些样本数据:

我希望查询返回:

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[];

感谢任何帮助!

【问题讨论】:

【参考方案1】:

如果点之间的数字总是只有一位,您可以使用如下窗口函数:

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

【讨论】:

以上是关于获取group by platform和semver的两条最新记录的主要内容,如果未能解决你的问题,请参考以下文章

使用 group by 和 Laravel 获取最新行

通过 JOIN 和 GROUP BY 获取最近的行?

使用 GROUP BY 和 ORDER BY pl/sql 获取结果集的 N 到 M 行 [重复]

group by 获取最大的一组 count(1) 值

在 MySQL 中的 Grouped by 查询期间获取时差

mysql在group by之后如何获取每一组中id最大的那一行