You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redshift/PostgreSQL分组末行条件选日期计算发票状态的SQL方案

实现方案

你可以通过窗口函数标记每个发票的最新上报记录,再根据标记动态替换判断用的日期即可,Redshift/PostgreSQL都支持该语法:

WITH ranked_trans AS (
    SELECT 
        invoice_Id,
        report_date,
        due_date,
        paid_date,
        -- 按发票分组,上报日期倒序排序,rn=1即为该发票最新上报记录
        ROW_NUMBER() OVER(PARTITION BY invoice_Id ORDER BY report_date DESC) AS rn
    FROM reported_transaction
)
SELECT 
    report_date,
    due_date,
    paid_date,
    CASE
        WHEN paid_date IS NOT NULL THEN 'PAID'
        -- 最新记录用当前日期判断,非最新记录用上报日期判断
        WHEN (CASE WHEN rn = 1 THEN DATE(GETDATE()) ELSE report_date END) > due_date THEN 'PAST_DUE'
        ELSE 'PENDING'
    END AS status
FROM ranked_trans;

逻辑说明

  • 先用CTE给每条记录打分组排序标记,同一invoice_Id下report_date最大的记录rn值为1,就是该发票的最新上报记录
  • 日期判断优先级:只要paid_date非空就直接判定为已支付,不受上报时间影响
  • 如果需要保留时间维度的判断,可以把DATE(GETDATE())改成GETDATE(),和你的字段类型对齐即可
  • 如果存在同一发票同一天有多条上报记录的情况,可以把ROW_NUMBER换成RANK,把当天所有上报记录都标记为最新

内容的提问来源于stack exchange,提问作者Alex Ramirez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:27:04