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

Presto SQL-对多个列的多个条件进行排序,sql,presto,Sql,Presto,我试图编写一个查询(如果可能的话)来根据多个条件对ID进行排序 我的桌子是这样的: id group subgroup value 1 A Q 12 2 A Z 10 3 B Z 14 4 A Z 20 5 B W 20 id rank_group rank_subg

我试图编写一个查询(如果可能的话)来根据多个条件对ID进行排序

我的桌子是这样的:

id     group    subgroup  value
1      A        Q         12
2      A        Z         10
3      B        Z         14
4      A        Z         20
5      B        W         20
id     rank_group    rank_subgroup
1      1             1
1      2             2
我尝试了以下查询:

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     group    subgroup  value
1      A        Q         12
2      A        Z         10
3      B        Z         14
4      A        Z         20
5      B        W         20
id     rank_group    rank_subgroup
1      1             1
1      2             2

我希望获得每个不同的id,并根据case语句的条件返回秩,但是添加所需的分区似乎会导致乘法,因为group by是必需的。我可以为每一列编写单独的查询,但如果可能的话,我希望避免这样做。

您想要这样的内容吗

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语句,行数在计算条件之前进行计数。因此,我最终得到了跳过计数的列,如:id rank_group 1 2 3 8 4 9,因为(与计算任何列之前求值的WHERE语句不同)case语句将首先计算列(本例中的行数)然后删除与条件不匹配的行。