Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于解析函数的SQL过滤查询结果_Sql_Google Bigquery_Having - Fatal编程技术网

基于解析函数的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 返回此结果集:

我想找到一种有效的方法来过滤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
返回此结果集:

现在我想过滤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