【问题标题】:SQL - Use dense_rank and group by togetherSQL - 一起使用dense_rank和group by
【发布时间】:2020-04-19 02:55:10
【问题描述】:

我的印象是当我们使用rank/row_number/dense_rank时,我们不能使用group by,但是为什么下面的逻辑运行成功

Select product, type, dense_rank() over (partition by type order by sum(sales) desc) as rnk 
From mytable 
Where date> dateadd(month, -3, getdate()) 
Group by product, type

为什么我可以在排名函数中按 sum(sales) 排序?

谢谢

【问题讨论】:

    标签: sql amazon-redshift window-functions


    【解决方案1】:

    您的查询基本上相当于:

    select pt.*,
           dense_rank() over (partition by type order by total_sales desc) as rnk 
    from (select product, type, sum(sales) as total_sales
          from mytable 
          where date > dateadd(month, -3, getdate()) 
          group by product, type
         ) pt;
    

    也就是说,dense_rank()GROUP BY 之后执行

    这是完全允许的。因此,您对这些不能一起使用的理解是不正确的。但是,有一些限制。 dense_rank() 中的引用必须是在GROUP BY 之后 已知的列或表达式。

    所以,这在您的版本中是允许的:

    dense_rank() over (partition by type order by sum(sales) desc) as rnk 
    

    但这不是:

    dense_rank() over (partition by type order by sales desc) as rnk 
    

    因为sales(单独)在group by 之后无效。

    【讨论】:

      【解决方案2】:

      您在 select 语句中使用的所有列,它包含在聚合函数或 group by 子句中。

      我们可以在同一个查询集中使用 rank 函数和 group by,但所有列都应该包含在聚合函数或 Group by 子句中。

      因此,此查询集通过对产品和类型进行分组来给出结果,并根据销售额从最高到最低给出排名,因为您在 Order by 子句中使用了降序。

      【讨论】:

        猜你喜欢
        • 2019-11-14
        • 2012-04-19
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多