基于解析函数的SQL过滤查询结果
我想找到一种有效的方法来过滤SQL中的排名函数 我有以下疑问:基于解析函数的SQL过滤查询结果,sql,google-bigquery,having,Sql,Google Bigquery,Having,我想找到一种有效的方法来过滤SQL中的排名函数 我有以下疑问: 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 返回此结果集:
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_等级<10或txn_等级<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]处有子句是不允许的
我能想到的唯一选择是将其创建为一个单独的表,并从中进行选择,但这似乎并不十分美观。关于如何做到这一点,还有其他想法吗?谢谢@Mikhail!是的,我就是这么想的。只是希望它能够在没有子选择的情况下完成它。不幸的是,子查询是这里的方式:o
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 `my_table` base
GROUP BY 1
)
WHERE SLS_rank < 300 OR txn_rank < 300