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

无需关联子查询如何用窗口函数实现MIN/MAX并匹配发票对应文档日期

解决方案

实现逻辑

核心思路是通过行号对齐实现无重复匹配:

  • 按客户分组,给所有发票按开票日期降序排列生成序号,序号越小的发票日期越新,优先匹配
  • 按客户分组,过滤掉所有晚于对应客户最大开票日期的无效文档后,给剩余文档按文档日期降序排列生成序号
  • 同客户下序号相同的发票和文档直接匹配,既保证每个文档只被使用一次,也满足最新发票优先匹配最新可用文档的规则

完整查询语句

WITH ranked_invoices AS (
  -- 给发票按客户分组、日期降序编行号
  SELECT 
    Client,
    InvoiceDate,
    ROW_NUMBER() OVER (PARTITION BY Client ORDER BY InvoiceDate DESC) AS inv_rn
  FROM Invoices
),
client_max_inv_dt AS (
  -- 聚合查询取每个客户的最大开票日期,用于过滤无效文档,不属于关联子查询,Zoho Analytics支持
  SELECT Client, MAX(InvoiceDate) AS max_inv_dt FROM Invoices GROUP BY Client
),
ranked_docs AS (
  -- 过滤无效文档后给文档按客户分组、日期降序编行号
  SELECT 
    d.Client,
    d.DocumentDate,
    ROW_NUMBER() OVER (PARTITION BY d.Client ORDER BY d.DocumentDate DESC) AS doc_rn
  FROM Documents d
  INNER JOIN client_max_inv_dt t 
    ON d.Client = t.Client 
    AND d.DocumentDate < t.max_inv_dt
)
-- 按客户+行号关联得到匹配结果
SELECT 
  ri.Client,
  ri.InvoiceDate,
  rd.DocumentDate
FROM ranked_invoices ri
INNER JOIN ranked_docs rd 
  ON ri.Client = rd.Client 
  AND ri.inv_rn = rd.doc_rn
ORDER BY ri.Client, ri.InvoiceDate DESC

效果验证

针对你提供的样例数据:

  • 排序后的发票行号:7/3/2021(行号1)、6/1/2021(行号2)、3/2/2021(行号3)
  • 过滤掉7/20/2021后的文档行号:5/29/2021(行号1)、5/10/2021(行号2)、2/9/2021(行号3)
  • 同行号关联后输出结果和你期望的完全一致

内容的提问来源于stack exchange,提问作者M Rhodes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:54:08