根据排名(底部和顶部)创建组 (Redshift)

Create Groups based on the Rank (Bottom and Top) (Redshift)

你好,我有前 3 列的信息,正在尝试生成第 4(黄色)列:

以下查询不太有效,它生成 top2 而不是 bottom2:

select t.*,
    case
    when "Sales Rank" >=1 and "Sales Rank" <=2 then 'Top 2'
    when "Sales Rank" >=2 and "Sales Rank" <= max("Sales Rank")-2 then 'Mid'
    when "Sales Rank" <= max("Sales Rank")-2 and "Sales Rank" <= max("Sales Rank") then 'Bottom 2' end as "Rank Group"
from table as t

你的不等式不正确,而且你应该使用 MAX 作为整个 table:

的解析函数
SELECT t.*,
    CASE WHEN "Sales Rank" <= 2 THEN 'Top 2'
         WHEN "Sales Rank" <= MAX("Sales Rank") OVER (PARTITION BY Team) -2 THEN 'Mid'
         ELSE 'Bottom 2' END AS "Rank Group"
FROM yourTable t;

要使用 max("Sales Rank"),您需要聚合。

要在没有聚合的情况下获得 table 中列的最大值,您需要一个 window 函数 (如您链接的 RANK() 函数).

例如,下面在 整个 table 中查找 max("Sales Rank")(这可能是也可能不是你想要做的,如果不是,只需在括号内添加一个 PARTITION BY xxx。)

select
  t.*,
  case
    when "Sales Rank" <= 2                            then 'Top 2'
    when "Sales Rank" >= max("Sales Rank") OVER() - 1 then 'Bottom 2'
                                                      else 'Mid'
  end
    as "Rank Group"
from
  table as t

注意,我简化了 CASE 表达式,因为它会在第一个匹配处停止 'searching'。

当您需要 window 函数时,您正在使用聚合函数。您想要每个团队 的结果,因此看起来像:

SELECT t.*,
       (CASE WHEN "Sales Rank" <= 2 THEN 'Top 2'
             WHEN "Sales Rank" <= MAX("Sales Rank") OVER (PARTITION BY Team) - 2 THEN 'Mid'
             ELSE 'Bottom 2'
        END) AS Rank_Group
FROM t;

请注意,您可以为此目的使用 window 函数。如果您有实际销售额,则不需要 "Sales Rank"

此外,修正您的列名。不要在名称中放置空格,也不要转义标识符。