Вопрос или проблема
У меня есть таблица в 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;
Объяснение запроса:
-
DISTINCT ON: Эта конструкция используется для выборки уникальных значений в указанных столбцах. В вашем случае это комбинация
account
,currency
иdate
. -
ORDER BY: Поскольку вы хотите получить последние записи, мы сортируем данные по
account
, а затем поcurrency
,date
и, наконец, поstatement_number
в порядке убывания (DESC
). Это позволяет получить последнюю запись по каждому уникальному сочетанию. -
Столбцы для вывода: Мы выбираем все необходимые столбцы:
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, чтобы подтвердить корректность результата.
Если у вас есть дополнительные вопросы или требуется более сложное решение, не стесняйтесь задать их!