根据排名(底部和顶部)创建组 (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"
。
此外,修正您的列名。不要在名称中放置空格,也不要转义标识符。
你好,我有前 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"
。
此外,修正您的列名。不要在名称中放置空格,也不要转义标识符。