Получить последнее вхождение в postgresql

Вопрос или проблема

У меня есть таблица в PostgreSQL, похожая на эту:

аккаунт номер_выписки сумма дата валюта
12345 00336/00001 10 2024-09-30 CHF
12345 00336/00001 42 2024-09-31 CHF
12345 00336/00001 45 2024-09-30 EUR
12345 00336/00002 82 2024-09-30 EUR
12345 00336/00003 50 2024-09-30 EUR
12345 00336/00004 85 2024-09-30 EUR
12345 00336/00001 39 2024-09-30 USD
12345 00336/00002 10 2024-09-30 USD

И мне нужно агрегировать (аккаунт, дата, валюта) и получить последнюю строку, упорядочив по номеру выписки, как это

аккаунт номер_выписки сумма дата валюта
12345 00336/00001 10 2024-09-30 CHF
12345 00336/00001 42 2024-09-31 CHF
12345 00336/00004 85 2024-09-30 EUR
12345 00336/00002 10 2024-09-30 USD

Как я могу это сделать?

SELECT
    *
from table_name
group by (аккаунт, дата, валюта)

Ответ или решение

Для получения последнего вхождения записи в PostgreSQL с учетом заданной структуры таблицы и требований к агрегации данных можно использовать запросы, которые объединяют функции окон и агрегации. В данном случае мы хотим сгруппировать данные по полям account, date и currency и получить последние записи для каждого уникального сочетания этих полей, упорядочив результат по statement_number.

Рассмотрим структуру вашей таблицы с данными:

CREATE TABLE transactions (
    account VARCHAR,
    statement_number VARCHAR,
    amount NUMERIC,
    date DATE,
    currency VARCHAR
);

SQL Запрос:

Вы можете использовать следующий SQL-запрос для достижения вашей цели:

SELECT DISTINCT ON (account, currency, date)
    account,
    statement_number,
    amount,
    date,
    currency
FROM transactions
ORDER BY account, currency, date, statement_number DESC;

Объяснение запроса:

  1. DISTINCT ON: Эта конструкция используется для выборки уникальных значений в указанных столбцах. В вашем случае это комбинация account, currency и date.

  2. ORDER BY: Поскольку вы хотите получить последние записи, мы сортируем данные по account, а затем по currency, date и, наконец, по statement_number в порядке убывания (DESC). Это позволяет получить последнюю запись по каждому уникальному сочетанию.

  3. Столбцы для вывода: Мы выбираем все необходимые столбцы: account, statement_number, amount, date и currency.

Пример использования:

Если у вас есть данные, как в приведенном вами примере, этот запрос вернет последние записи для каждого уникального сочетания полей account, date и currency с упорядочением по statement_number.

account statement_number amount date currency
12345 00336/00001 10 2024-09-30 CHF
12345 00336/00001 42 2024-09-31 CHF
12345 00336/00004 85 2024-09-30 EUR
12345 00336/00002 10 2024-09-30 USD

Заключение:

Данный запрос эффективно агрегирует данные, позволяя вам извлекать последние записи на основе заданных параметров. Убедитесь, что ваш PostgreSQL достаточно оптимизирован для выполнения таких запросов, особенно при работе с большими объемами данных. Опробуйте приведенный пример в вашей среде PostgreSQL, чтобы подтвердить корректность результата.

Если у вас есть дополнительные вопросы или требуется более сложное решение, не стесняйтесь задать их!

Оцените материал
Добавить комментарий

Капча загружается...