Sql BigQuery中供应商提前期的计算

Sql BigQuery中供应商提前期的计算,sql,google-bigquery,Sql,Google Bigquery,我想在BigQuery中计算我们供应商的交付周期(交付给客户的日期(下表oli)-订单日期(下表olit)) 在我们的电子商务公司;我们的每个客户可能都有1/多个供应商的订单。因此,我们在给定订单中为每个供应商分配一个装运编号(下表ol) 因此,我们将供应商的提前期计算为装运数量的平均提前期 例如,假设供应商A总共有2个订单:订单X和订单Y中有供应商A的订单;订单X中供应商A的订单提前期(装运编号为1)为10小时,订单Y中供应商A的订单提前期(装运编号为2)为30小时;供应商A的提前期-->(装

我想在BigQuery中计算我们供应商的交付周期(交付给客户的日期(下表oli)-订单日期(下表olit))

在我们的电子商务公司;我们的每个客户可能都有1/多个供应商的订单。因此,我们在给定订单中为每个供应商分配一个装运编号(下表ol)

因此,我们将供应商的提前期计算为装运数量的平均提前期

例如,假设供应商A总共有2个订单:订单X和订单Y中有供应商A的订单;订单X中供应商A的订单提前期(装运编号为1)为10小时,订单Y中供应商A的订单提前期(装运编号为2)为30小时;供应商A的提前期-->(装运提前期\编号\ 1+装运提前期\编号\ 2)/2=(10+30)/2=20小时

发货编号对于给定订单中的供应商是唯一的,但同时发货编号可能包含多个订单行(下表ol)。例如,装运编号可能包括两个订单行。1号线的提前期为5小时,2号线的提前期为15小时,则装运的提前期_编号_1为(5+15)/2=10小时

我可以用下面的代码轻松计算SQL中装运数量的提前期:

SELECT
    ol.SHIPMENT_NUMBER,
    avg(timestamp_diff(oli.DELIVERY_DATE, olit.ORDER_DATE, hour)) ORDERTOCUSTOMER
FROM
    ORDERLINE ol
    JOIN ORDERLINEITEMTRX olit on olit.order_line_sk = ol.ORDER_LINE_SK
    join ORDERLINEITEM oli ON olit.order_line_item_sk = oli.ORDER_LINE_ITEM_SK
WHERE
    s.SUPPLIER_ID = 'SupplierX'
group by
    SHIPMENT_NUMBER
根据我的手动控制,结果是正确的

但是,当我使用下面的代码在供应商ID级别进行聚合时,我得到了错误的结果。为了简化,我只与一家以上和以下供应商合作。根据我的手动控制,结果必须是453619小时,但是BigQuery报告457695小时

SELECT
    s.SUPPLIER_ID,
    AVG(OTC.ORDERTOCUSTOMER)
FROM
    ORDERLINE ol
    JOIN ORDERLINEITEMTRX olit on olit.order_line_sk = ol.ORDER_LINE_SK
    join ORDERLINEITEM oli ON olit.order_line_item_sk = oli.ORDER_LINE_ITEM_SK
    RIGHT JOIN SUPPLIER s ON s.SUPPLIER_SK = olit.SUPPLIER_SK
    INNER JOIN (
        SELECT
            ol.SHIPMENT_NUMBER,
            avg(timestamp_diff(oli.DELIVERY_DATE, olit.ORDER_DATE, hour)) ORDERTOCUSTOMER
        FROM
            ORDERLINE ol
            JOIN ORDERLINEITEMTRX olit on olit.order_line_sk = ol.ORDER_LINE_SK
            join ORDERLINEITEM oli ON olit.order_line_item_sk = oli.ORDER_LINE_ITEM_SK
        group by
            SHIPMENT_NUMBER
        WHERE s.SUPPLIER_ID = 'SupplierX'
    ) AS OTC ON ol.SHIPMENT_NUMBER = OTC.SHIPMENT_NUMBER
WHERE s.SUPPLIER_ID = 'SupplierX'
group by s.SUPPLIER_ID
我做错了什么?示例数据集和预期结果如下所示:


由于上述事实(一个装运编号可能有一个/多个订单行),每个装运编号在原始订单表中可能会多次重复出现,因此这里的挑战是在不过度计算的情况下找到装运编号的平均提前期,即。,查找唯一数字的平均值。

我刚刚将供应商id添加到您的第一个查询中,然后使用此输出

WITH
shipment_lead_times as 
(
    SELECT
        s.SUPPLIER_ID,
        ol.SHIPMENT_NUMBER,
        avg(timestamp_diff(oli.DELIVERY_DATE, olit.ORDER_DATE, hour)) ORDERTOCUSTOMER
    FROM
        ORDERLINE ol
        JOIN ORDERLINEITEMTRX olit on olit.order_line_sk = ol.ORDER_LINE_SK
        join ORDERLINEITEM oli ON olit.order_line_item_sk = oli.ORDER_LINE_ITEM_SK
    WHERE
        s.SUPPLIER_ID = 'SupplierX'
    group by
        SHIPMENT_NUMBER,
        SUPPLIER_ID
)
select 
    supplier_id,
    count(*) as shipments,
    avg(ordertocustomer) as avg_leadtime
from shipment_lead_times
group by supplier_id

样本数据和期望的结果将非常有用。亲爱的@GordonLinoff,感谢您的反馈。已添加。@user15560640在第二次查询中,您想做什么?在我的第二次查询中,我想找到供应商SupplierX在其所有订单中的总体平均交付周期。实际上,这只是装运数量提前期的简单平均值。