Возьмите две последние записи группы по платформе и по полу - PullRequest
1 голос
/ 27 апреля 2020

Для каждой пары platform и semver Я пытаюсь получить вторую новейшую запись, чтобы всегда поддерживать последнюю версию приложения до последней.

Вот моя схема :

id, platform, semver, name

Некоторые примеры данных:

enter image description here

Я хочу, чтобы запрос вернул:

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

Обратите внимание, что это не последняя запись, а вторая последняя запись.

Я могу сортировать по полу, используя, но получение второй последней записи для каждого приложения приводит меня в замешательство.

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

Цени любую помощь!

1 Ответ

1 голос
/ 27 апреля 2020

Если значения между точками всегда равны одной ди git, вы можете использовать оконные функции следующим образом:

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
...