PostgreSQL - показывает последние N строк для каждой отсортированной группы - PullRequest
1 голос
/ 02 октября 2019

В отношении следующих сообщений:

Получение последней записи в каждой группе - MySQL

Сгруппированный LIMIT в PostgreSQL: показать первые N строкдля каждой группы?

Ограничение Postgresql по N группам

Я написал запрос, чтобы найти последние 3 записи из последних 3 групп событий журнала, разделенныхдень с максимум 9 записями, и мне удалось собрать следующие данные из таблицы журнала postgresql:

enter image description here

Запрос, который я использовал для их полученияявляется следующим:

SELECT
    *
FROM (
    SELECT
        ROW_NUMBER() OVER (PARTITION BY created_at::date ORDER BY created_at::time DESC) AS row_number,
        DENSE_RANK() OVER (ORDER BY created_at::date DESC) AS group_number,
        l.*
    FROM
        logs l
    WHERE
        account_id = 1) subquery
WHERE
    subquery.row_number <= 3
    AND group_number <= 3
LIMIT 9;

Однако я пропускаю один последний шаг: результаты «группируются» по дням в порядке убывания (что хорошо), но в каждой группе порядоккажется, что время не работает.

Фактически ожидаемый порядок должен быть таким (при отображении только каждой строки id):

| EXISTING ROW ORDERING | EXPECTED ROW ORDERING |
| --------------------- | --------------------- |         
           52                      56
           53                      53
           56                      52
           46                      48
           48                      47 
           47                      46
           30                      30
           31                      31
           32                      32

Есть идеи? Спасибо.

1 Ответ

2 голосов
/ 02 октября 2019

Если вы хотите, чтобы данные были в определенном порядке, тогда вам нужно иметь order by. Таблицы SQL и наборы результатов представляют неупорядоченные наборы. Единственное исключение - когда самый внешний запрос имеет order by.

Итак:

order by created_at desc
...