我想找到一种有效的方法来过滤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
哪个返回此结果集:
现在,我想过滤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子句中是不允许的
我能想到的唯一选择是将其创建为一个单独的表并从中选择,但这看起来并不十分漂亮。关于如何执行此操作还有其他想法吗?
答案 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 中查找更多示例。