通过platform和semver抓取group的两条最新记录
Grab two latest records of group by platform and semver
对于 platform
和 semver
的每一对,我都在尝试获取第二个最新记录,以此来始终支持从以前的应用程序版本到最新版本。
这是我的架构:
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
对于 platform
和 semver
的每一对,我都在尝试获取第二个最新记录,以此来始终支持从以前的应用程序版本到最新版本。
这是我的架构:
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