基于PERCENT_RANK排名用CASE语句生成星级评分的SQL问题
问题解决方法
你遇到的问题是因为多数SQL数据库不支持在同一条SELECT语句中直接引用刚定义的窗口函数计算列,导致CASE语句无法正确关联原有的分组(PARTITION BY)逻辑。以下是两种可行的解决办法:
方法一:用子查询/CTE先计算排名,再生成星级
先通过子查询或公共表表达式(CTE)算出分组后的排名,再在外层查询里用CASE基于这个排名生成星级。这样能保证排名的分组逻辑完全保留。
示例代码(CTE版本):
WITH ranked_data AS ( SELECT Industry_Group, NET_ASSETS_EOY_AMT, PARTCP_ACCOUNT_BAL_CNT, PERCENT_RANK() OVER ( PARTITION BY Industry_Group ORDER BY (NET_ASSETS_EOY_AMT/PARTCP_ACCOUNT_BAL_CNT) ASC ) AS EE_Balance_Acct_Rank FROM your_table_name -- 替换成你的实际表名 ) SELECT *, CASE WHEN EE_Balance_Acct_Rank BETWEEN 0 AND 0.1 THEN 0.5 ELSE 5 END AS ee_balance_stars FROM ranked_data;
示例代码(子查询版本):
SELECT *, CASE WHEN EE_Balance_Acct_Rank BETWEEN 0 AND 0.1 THEN 0.5 ELSE 5 END AS ee_balance_stars FROM ( SELECT Industry_Group, NET_ASSETS_EOY_AMT, PARTCP_ACCOUNT_BAL_CNT, PERCENT_RANK() OVER ( PARTITION BY Industry_Group ORDER BY (NET_ASSETS_EOY_AMT/PARTCP_ACCOUNT_BAL_CNT) ASC ) AS EE_Balance_Acct_Rank FROM your_table_name -- 替换成你的实际表名 ) AS subquery;
方法二:将窗口函数直接嵌入CASE语句
如果不想用子查询/CTE,可以把PERCENT_RANK的逻辑直接写到CASE的条件里,跳过单独定义计算列的步骤,这样能避免引用问题。
示例代码:
SELECT Industry_Group, NET_ASSETS_EOY_AMT, PARTCP_ACCOUNT_BAL_CNT, PERCENT_RANK() OVER ( PARTITION BY Industry_Group ORDER BY (NET_ASSETS_EOY_AMT/PARTCP_ACCOUNT_BAL_CNT) ASC ) AS EE_Balance_Acct_Rank, CASE WHEN PERCENT_RANK() OVER ( PARTITION BY Industry_Group ORDER BY (NET_ASSETS_EOY_AMT/PARTCP_ACCOUNT_BAL_CNT) ASC ) BETWEEN 0 AND 0.1 THEN 0.5 ELSE 5 END AS ee_balance_stars FROM your_table_name; -- 替换成你的实际表名
注意:第二种方法会重复计算PERCENT_RANK,部分数据库可能会自动优化,但如果数据量较大,子查询/CTE的性能会更优。
内容的提问来源于stack exchange,提问作者jviking
相关产品推荐
相关产品推荐

