SQL根据解析函数过滤查询结果

Mur*_*iel 3 sql having google-bigquery

我想找到一种有效的方法来过滤RANK() OVERSQL 中的函数。

我有以下查询:

SELECT
    base.ITEM_SKU_NBR,
    RANK() OVER (ORDER BY SUM(base.NET_SLS_AMT) DESC) AS SLS_rank,
    RANK() OVER (ORDER BY COUNT(DISTINCT base.txn_id) DESC) AS txn_rank
FROM
    `my_table` base
GROUP BY
    1
Run Code Online (Sandbox Code Playgroud)

返回此结果集:

在此输入图像描述

现在我想过滤 is SLS_rank< 10 或txn_rankis < 10 的项目。理想情况下,我想在HAVING子句中执行此操作,如下所示:

SELECT
    base.ITEM_SKU_NBR,
    RANK() OVER (ORDER BY SUM(base.NET_SLS_AMT) DESC) AS SLS_rank,
    RANK() OVER (ORDER BY COUNT(DISTINCT base.txn_id) DESC) AS txn_rank
FROM
    `my_table` base
GROUP BY
    1
HAVING   
    SLS_rank < 10 OR txn_rank < 10
Run Code Online (Sandbox Code Playgroud)

但 bigquery 抛出错误:

列 SLS_rank 包含分析函数,这在 [9:8] 处的 HAVING 子句中是不允许的

我能想到的唯一选择是将其创建为单独的表并从那里进行选择,但这看起来不太漂亮。关于如何做到这一点还有其他想法吗?

小智 7

2021 年 6 月更新。

BigQuery 于2021 年 5 月 10 日宣布支持 QUALIFY 子句。

QUALIFY 子句过滤分析函数的结果。QUALIFY 子句或 SELECT 列表中需要存在分析函数。

您可以通过以下方式通过 QUALIFY 实现​​您的需求:

SELECT
    base.ITEM_SKU_NBR,
    RANK() OVER (ORDER BY SUM(base.NET_SLS_AMT) DESC) AS SLS_rank,
    RANK() OVER (ORDER BY COUNT(DISTINCT base.txn_id) DESC) AS txn_rank
FROM `my_table` base
GROUP BY 1
QUALIFY SLS_rank < 10 OR txn_rank < 10
Run Code Online (Sandbox Code Playgroud)

在文档中查找更多示例。