用PgSQL查询Intraday(SQL查询每个账户的最新金额和日期)

要在 PostgreSQL 中实现从所有金额数据中筛选出每个账户的最新金额和日期,并且如果当天没有金额记录,则使用最后一次收到的金额和日期,可以使用以下步骤:

示例数据表结构

假设你有一个名为 account_balances 的表,结构如下:

CREATE TABLE account_balances (
    account_id INT,
    amount NUMERIC,
    transaction_date DATE
);

查询步骤

  1. 选择最新的交易日期: 首先,你需要找出每个账户的最新日期。
  2. 获取当天金额: 然后,你需要检查当天的交易记录。
  3. 如果当天没有记录,则获取最后一条记录: 如果当天没有记录,则获取该账户的上一条记录。

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;

查询解析

  1. latest_transactions: 这个公共表表达式 (CTE) 获取当天的最新交易记录。如果当天有记录,则 ROW_NUMBER() 为 1。
  2. previous_transactions: 这个 CTE 获取前一天的所有记录,并进行排序。
  3. 联合查询: 最终的选择通过 FULL OUTER JOIN 将今天的记录与以往的记录结合在一起,使用 COALESCE 函数选择最新的金额和日期。

注意事项

  • 确保 transaction_date 的格式与当前日期的格式一致。
  • 根据实际需要,可以调整表名和字段名。

这样做可以确保你能获取到所需的账户最新余额和日期信息。

猜你喜欢

转载自blog.csdn.net/moshowgame/article/details/143222896