Presto SQL - 对多列的多个条件进行排名

Posted

技术标签:

【中文标题】Presto SQL - 对多列的多个条件进行排名【英文标题】:Presto SQL - Rank Multiple Conditions for Multiple Columns 【发布时间】:2019-02-04 19:42:58 【问题描述】:

我正在尝试编写一个查询(如果可能)来根据多个条件对 i​​d 进行排名。

我的桌子是这样的:

id     group    subgroup  value
1      A        Q         12
2      A        Z         10
3      B        Z         14
4      A        Z         20
5      B        W         20

我试过这个查询:

SELECT id,
       CASE WHEN group = 'A' THEN ROW_NUMBER() OVER (PARTITION BY group ORDER BY SUM(value) DESC) AS rank_group
       CASE WHEN group = 'A' AND subgroup = 'Z' THEN ROW_NUMBER() OVER (PARTITION BY group, subgroup ORDER BY SUM(value) DESC) AS rank_subgroup
FROM table
GROUP BY group, subgroup

但结果是这样的:

id     rank_group    rank_subgroup
1      1             1
1      2             2

我想获取每个不同的 id 并根据 case 语句的条件返回排名,但看起来添加所需的分区会导致乘法,因为 group by 是必要的。我可以为每一列编写单独的查询,但我想尽可能避免。

【问题讨论】:

编辑您的问题并提供您想要的结果。排名与group by 有什么关系?这个问题没有意义。 【参考方案1】:

你想要这样的东西吗?

select t.*,
       dense_rank() over (order by sumg, group),
       dense_rank() over (partition by group order by sumsg, subg),
from (select t.*,
             sum(value) over (partition by group) as sumg,
             sum(value) over (partition by group, subgroup) as sumsg
      from t
     ) t;

这是我解释你可能想要什么的最佳猜测。

【讨论】:

我想在 case 语句中传递条件来创建每一列。但是,对于 case 语句,row_number 是在条件被评估之前计算的。因此,我最终得到具有跳过计数的列,如下所示: id rank_group 1 1 2 2 3 8 4 9 因为(与在计算任何列之前评估的 WHERE 语句不同)case 语句将首先计算列(在这种情况下为 row_number ) 然后删除不符合条件的行。

以上是关于Presto SQL - 对多列的多个条件进行排名的主要内容,如果未能解决你的问题,请参考以下文章

基于多个条件对字段进行排名的 T-Sql 语法

使用右表上的总和分组对多列进行 SQL 连接

Presto Sql:如何选择数组中排名最高的值

SQL 分析函数:对多个分区进行排名

熊猫按多列排名

pyspark中基于条件对多列进行分组的累积和函数