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

BigQuery:如何关联每个SKU的最新匹配价格行

问题描述

我有两张表:一张是包含嵌套line_items结构的订单表,另一张是存储各产品SKU价格历史的价格历史表。

订单表

订单ID订单日期商品SKU商品数量商品小计
12022-07-23SKU1712.34
SKU219.99
22022-07-12SKU111.12
SKU3532.54

价格历史表

商品SKU生效日期成本
SKU12022-07-200.78
SKU22022-03-024.50
SKU12022-03-020.56
SKU32022-03-024.32

期望输出

订单ID订单日期商品SKU商品数量商品小计成本
12022-07-23SKU1712.340.78
SKU219.994.50
22022-07-12SKU111.120.56
SKU3532.544.32

我需要获取下单时对应的产品成本,当前用的查询语句如下:

SELECT order_id, order_date,
  ARRAY(
    SELECT AS STRUCT
    item_sku,
    item_quantity,
    item_subtotal,
    cost.product_cost
    FROM UNNEST(line_items) as items
    JOIN `price_history_table` as cost
    ON items.item_sku = cost.sku AND effective_date < order_date 
  ) AS line_items,
  FROM
  `order_data_table`

这个查询能运行,但会为价格历史表中每条匹配的记录生成单独的line_item数组行。我只想匹配该SKU的最新价格,想加类似ORDER BY effective_date DESC LIMIT 1的逻辑,但不知道怎么正确添加。

解决方案

以下两种写法都能实现需求,针对BigQuery语法优化:

方法一:用QUALIFY子句直接筛选最新价格

这是最简洁的写法,利用窗口函数给每个SKU的价格按生效日期倒序编号,只保留编号为1的最新记录:

SELECT 
  order_id, 
  order_date,
  ARRAY(
    SELECT AS STRUCT
      items.item_sku,
      items.item_quantity,
      items.item_subtotal,
      cost.成本 AS product_cost
    FROM UNNEST(line_items) as items
    JOIN `price_history_table` as cost
      ON items.item_sku = cost.商品SKU 
      AND cost.生效日期 < order_date
    QUALIFY ROW_NUMBER() OVER (PARTITION BY items.item_sku ORDER BY cost.生效日期 DESC) = 1
  ) AS line_items
FROM `order_data_table`

方法二:预筛选价格历史表的最新记录

如果你的环境不支持QUALIFY,可以先对价格历史表预处理,再关联订单表:

SELECT 
  order_id, 
  order_date,
  ARRAY(
    SELECT AS STRUCT
      items.item_sku,
      items.item_quantity,
      items.item_subtotal,
      latest_cost.成本 AS product_cost
    FROM UNNEST(line_items) as items
    JOIN (
      SELECT 
        商品SKU,
        成本,
        生效日期,
        ROW_NUMBER() OVER (PARTITION BY 商品SKU ORDER BY 生效日期 DESC) AS rn
      FROM `price_history_table`
    ) AS latest_cost
      ON items.item_sku = latest_cost.商品SKU 
      AND latest_cost.生效日期 < order_date
      AND latest_cost.rn = 1
  ) AS line_items
FROM `order_data_table`

关键说明

  • ROW_NUMBER() OVER (PARTITION BY 商品SKU ORDER BY 生效日期 DESC):给每个SKU的价格记录按生效日期从新到旧编号,最新的价格编号为1。
  • 修正了原查询中字段名不匹配的问题(比如价格历史表的商品SKU对应订单行的item_sku,成本对应需要的产品成本字段)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:27:31