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)
在文档中查找更多示例。
| 归档时间: |
|
| 查看次数: |
1839 次 |
| 最近记录: |