基于解析函数的SQL过滤查询结果

时间:2019-12-18 18:05:50

标签: sql google-bigquery having

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

我有以下查询:

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

哪个返回此结果集:

enter image description here

现在,我想过滤SLS_rank <10或txn_rank <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

但是bigquery抛出错误:

  

列SLS_rank包含一个解析函数,在[9:8]的HAVING子句中是不允许的

我能想到的唯一选择是将其创建为一个单独的表并从中选择,但这看起来并不十分漂亮。关于如何执行此操作还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

SELECT * FROM (
  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 `np-blacklocus.data_commons.preferred_pricing_transaction_base` base
  GROUP BY 1
)
WHERE SLS_rank < 300 OR txn_rank < 300

答案 1 :(得分:0)

2021 年 6 月更新。

BigQuery 宣布支持 the 10th of May, 2021 上的 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

documentation 中查找更多示例。