Google bigquery 在Google BigQuery SQL中,当左键连接到另一个表时,如何查找特定列的最小值?

Google bigquery 在Google BigQuery SQL中,当左键连接到另一个表时,如何查找特定列的最小值?,google-bigquery,Google Bigquery,我正努力在事务级别上收回最小值和最大值。我试图做的是通过左连接将一种类型的事务与另一种类型的事务配对。然而,由于有多个事务可以与我的异常填充相匹配,所以我提取了许多重复的事务。我试着遵循现有的问题并实施这些技巧,但仍然没有成功 以下是我的查询示例: SELECT * FROM ( Select DISTINCT B.POS_TRANS_ID, B.SLS_DT, (MAX(B.SLS_DT) < H.BUS_DT) AS MAX_SLS_

我正努力在事务级别上收回最小值和最大值。我试图做的是通过左连接将一种类型的事务与另一种类型的事务配对。然而,由于有多个事务可以与我的异常填充相匹配,所以我提取了许多重复的事务。我试着遵循现有的问题并实施这些技巧,但仍然没有成功

以下是我的查询示例:

SELECT *

FROM ( Select DISTINCT 
        B.POS_TRANS_ID,
        B.SLS_DT,
        (MAX(B.SLS_DT) < H.BUS_DT) AS MAX_SLS_DT,
        (MIN(DATE_DIFF(H.BUS_DT,B.SLS_DT,DAY))) AS MIN_DAY_DIFF, 
        B.NET_EXT_RETL_AMT,
        H.STR_NBR,
        H.MKUP_MKDN_CTRL_NBR,
        H.MKDN_RSN_TXT,
        H.BUS_DT,
        H.CURR_RETL_AMT,
        H.TRANS_ID

FROM `EXAMPLE_TABLE` H
      left join `miami` B
      on H.SKU_NBR = B.SKU_NBR
      and H.STR_NBR = B.STR_NBR
      and (H.UNT_CNT*-1) = B.QTY_SOLD
      and (H.NET_MUMD_AMT*-1) = (B.CURR_RETL_AMT)

where 
      B.QTY_SOLD < 0
      and cast(MKUP_MKDN_CTRL_NBR as string) not like ('99%')
      AND H.TRANS_ID IN ('FLORIDA_TRANS')


GROUP BY 
        B.POS_TRANS_ID,
        B.SLS_DT, 
        B.NET_EXT_RETL_AMT,
        H.STR_NBR,
        H.MKUP_MKDN_CTRL_NBR,
        H.MKDN_RSN_TXT,
        H.BUS_DT,
        H.CURR_RETL_AMT,
        H.TRANS_ID)Z

WHERE MAX_SLS_DT IS TRUE
      AND Z.MKUP_MKDN_CTRL_NBR = 69308
      AND Z.STR_NBR = '3204'
当我实际上只想按存储按事务计算最小日期差和最大日期差时

预期结果:

 POS_TRANS_ID   SLS_DT    MAX_SLS_DT    MIN_DAY_DIFF    NET_EXT_RETL_AMT    STR_NBR MKUP_MKDN_CTRL_NBR
        8824    4/25/2018   TRUE            363                 -99           3204       69308
我仍在学习SQL,因此任何帮助都将不胜感激。提前谢谢你

行号是此处的一个选项:

WITH cte AS (
    SELECT
        B.POS_TRANS_ID,
        B.SLS_DT,
        MAX(B.SLS_DT) < H.BUS_DT AS MAX_SLS_DT,
        MIN(DATE_DIFF(H.BUS_DT, B.SLS_DT, DAY)) AS MIN_DAY_DIFF, 
        B.NET_EXT_RETL_AMT,
        H.STR_NBR,
        H.MKUP_MKDN_CTRL_NBR,
        H.MKDN_RSN_TXT,
        H.BUS_DT,
        H.CURR_RETL_AMT,
        H.TRANS_ID,
        ROW_NUMBER() OVER (PARTITION BY H.STR_NBR
                           ORDER BY MIN(DATE_DIFF(H.BUS_DT, B.SLS_DT, DAY))) rn
    FROM EXAMPLE_TABLE H
    LEFT JOIN miami B
        ON H.SKU_NBR = B.SKU_NBR AND
           H.STR_NBR = B.STR_NBR AND
           H.UNT_CNT*-1 = B.QTY_SOLD AND
           H.NET_MUMD_AMT*-1 = B.CURR_RETL_AMT AND
           MKUP_MKDN_CTRL_NBR = 69308
    WHERE
        B.QTY_SOLD < 0 AND
        CAST(MKUP_MKDN_CTRL_NBR AS string) NOT LIKE '99%' AND
        H.TRANS_ID = 'FLORIDA_TRANS'
    GROUP BY 
        B.POS_TRANS_ID,
        B.SLS_DT, 
        B.NET_EXT_RETL_AMT,
        H.STR_NBR,
        H.MKUP_MKDN_CTRL_NBR,
        H.MKDN_RSN_TXT,
        H.BUS_DT,
        H.CURR_RETL_AMT,
        H.TRANS_ID
    HAVING
        MAX(B.SLS_DT) < H.BUS_DT IS TRUE
)

SELECT *
FROM cte
WHERE rn = 1;

问题是我正试图将这种观点推广到很多商店/SKU。因此,我无法限制查询,因为我正在查找大约350K条记录。这是我异常总数的大小,我正在尝试将一个事务与每个记录进行匹配。STR_NBR是跟踪存储的列吗?如果没有,哪一列会这样做?是的,STR_NBR是门店标识。所有这些数据都在sku/store/transaction级别。@Tam我已使用一个选项更新了我的答案,该选项使用的行号可能正是您要查找的行号。由于GBQ不允许在where语句中使用聚合函数,我不得不对其进行轻微修改。在CTE语句之外,我过滤MAX_SLS_DT为真,但它不返回任何结果。但是我不确定为什么。
WITH cte AS (
    SELECT
        B.POS_TRANS_ID,
        B.SLS_DT,
        MAX(B.SLS_DT) < H.BUS_DT AS MAX_SLS_DT,
        MIN(DATE_DIFF(H.BUS_DT, B.SLS_DT, DAY)) AS MIN_DAY_DIFF, 
        B.NET_EXT_RETL_AMT,
        H.STR_NBR,
        H.MKUP_MKDN_CTRL_NBR,
        H.MKDN_RSN_TXT,
        H.BUS_DT,
        H.CURR_RETL_AMT,
        H.TRANS_ID,
        ROW_NUMBER() OVER (PARTITION BY H.STR_NBR
                           ORDER BY MIN(DATE_DIFF(H.BUS_DT, B.SLS_DT, DAY))) rn
    FROM EXAMPLE_TABLE H
    LEFT JOIN miami B
        ON H.SKU_NBR = B.SKU_NBR AND
           H.STR_NBR = B.STR_NBR AND
           H.UNT_CNT*-1 = B.QTY_SOLD AND
           H.NET_MUMD_AMT*-1 = B.CURR_RETL_AMT AND
           MKUP_MKDN_CTRL_NBR = 69308
    WHERE
        B.QTY_SOLD < 0 AND
        CAST(MKUP_MKDN_CTRL_NBR AS string) NOT LIKE '99%' AND
        H.TRANS_ID = 'FLORIDA_TRANS'
    GROUP BY 
        B.POS_TRANS_ID,
        B.SLS_DT, 
        B.NET_EXT_RETL_AMT,
        H.STR_NBR,
        H.MKUP_MKDN_CTRL_NBR,
        H.MKDN_RSN_TXT,
        H.BUS_DT,
        H.CURR_RETL_AMT,
        H.TRANS_ID
    HAVING
        MAX(B.SLS_DT) < H.BUS_DT IS TRUE
)

SELECT *
FROM cte
WHERE rn = 1;