要在 PostgreSQL 中实现从所有金额数据中筛选出每个账户的最新金额和日期,并且如果当天没有金额记录,则使用最后一次收到的金额和日期,可以使用以下步骤:
示例数据表结构
假设你有一个名为 account_balances 的表,结构如下:
CREATE TABLE account_balances (
account_id INT,
amount NUMERIC,
transaction_date DATE
);
查询步骤
- 选择最新的交易日期: 首先,你需要找出每个账户的最新日期。
- 获取当天金额: 然后,你需要检查当天的交易记录。
- 如果当天没有记录,则获取最后一条记录: 如果当天没有记录,则获取该账户的上一条记录。
SQL 查询示例
下面是一个可能的 SQL 查询示例:
WITH latest_transactions AS (
SELECT
account_id,
amount,
transaction_date,
ROW_NUMBER() OVER (PARTITION BY account_id ORDER BY transaction_date DESC) AS rn
FROM
account_balances
WHERE
transaction_date = CURRENT_DATE
),
previous_transactions AS (
SELECT
account_id,
amount,
transaction_date,
ROW_NUMBER() OVER (PARTITION BY account_id ORDER BY transaction_date DESC) AS rn
FROM
account_balances
WHERE
transaction_date < CURRENT_DATE
)
SELECT
lt.account_id,
COALESCE(lt.amount, pt.amount) AS latest_amount,
COALESCE(lt.transaction_date, pt.transaction_date) AS latest_date
FROM
latest_transactions lt
FULL OUTER JOIN
previous_transactions pt ON lt.account_id = pt.account_id
WHERE
lt.rn = 1 OR pt.rn = 1
ORDER BY
lt.account_id;
查询解析
- latest_transactions: 这个公共表表达式 (CTE) 获取当天的最新交易记录。如果当天有记录,则 ROW_NUMBER() 为 1。
- previous_transactions: 这个 CTE 获取前一天的所有记录,并进行排序。
- 联合查询: 最终的选择通过 FULL OUTER JOIN 将今天的记录与以往的记录结合在一起,使用 COALESCE 函数选择最新的金额和日期。
注意事项
- 确保 transaction_date 的格式与当前日期的格式一致。
- 根据实际需要,可以调整表名和字段名。
这样做可以确保你能获取到所需的账户最新余额和日期信息。