Snowflake需求:根据PO_NUMBER=0的情况确定返回的行号
供应商首单查询优化方案
原查询存在两处关键问题:一是窗口函数别名ROWNUM与Oracle内置伪列冲突,会引发逻辑错误;二是未满足**忽略PO_NUMBER=0记录(仅当为供应商唯一记录时保留)**的业务规则。以下是优化方案:
优化SQL
WITH supplier_delivery_stats AS ( SELECT dh.*, ROW_NUMBER() OVER (PARTITION BY SUPPLIER_CODE ORDER BY DELIVERY_DATE, PO_NUMBER) AS rec_rank, COUNT(*) OVER (PARTITION BY SUPPLIER_CODE) AS total_records, SUM(CASE WHEN PO_NUMBER != 0 THEN 1 ELSE 0 END) OVER (PARTITION BY SUPPLIER_CODE) AS valid_po_count FROM DELIVERY_HISTORY dh ) SELECT SUPPLIER_CODE, SUPPLIER_NAME, DELIVERY_LOCATION, RECEIVED_BY, ORDER_DATE, PO_NUMBER, DELIVERY_DATE FROM supplier_delivery_stats WHERE -- 规则1:供应商仅有1条记录,或无有效PO(全为0),取排序第1条 (total_records = 1 OR (valid_po_count = 0 AND rec_rank = 1)) -- 规则2:多条记录且存在有效PO,取最早的有效PO记录 OR (total_records > 1 AND valid_po_count > 0 AND rec_rank = (SELECT MIN(rec_rank) FROM supplier_delivery_stats sds WHERE sds.SUPPLIER_CODE = supplier_delivery_stats.SUPPLIER_CODE AND sds.PO_NUMBER != 0))
核心逻辑说明
- 统计指标计算:通过窗口函数一次性计算每个供应商的总记录数、有效PO(PO_NUMBER≠0)数量,以及每条记录在供应商内的排序序号;
- 规则匹配:
- 当供应商只有一条记录,或所有记录都是PO_NUMBER=0时,直接取排序后的第一条;
- 当供应商有多条记录且存在有效PO时,筛选出该供应商下序号最小的有效PO记录,实现“忽略PO_NUMBER=0记录”的需求。
内容的提问来源于stack exchange,提问作者punsoca
相关产品推荐
相关产品推荐

