SQL Server 2012 PERCENT_RANK() 排除 NULL

Jac*_*ane 0 sql-server null

SELECT [Cole_Crops], 
       PERCENT_RANK() OVER (PARTITION BY HUC02 
                            ORDER BY [Cole_Crops]) AS Cole_Crops_PCT_RANK], 
       [Row_Crops], 
       PERCENT_RANK() OVER (PARTITION BY HUC02 
                            ORDER BY [Row_Crops]) AS Row_Crops_PCT_RANK]            
FROM V012_CDLMAX_09
Run Code Online (Sandbox Code Playgroud)

在需要对多个列进行排名的查询中,如何排除 NULL 值对 PERCENT_RANK 的影响?

SQL Server 2012PERCENT_RANK()将 NULL 视为分布中的实际值。如果要对一列进行排名,您可以简单地添加一个 where 子句(即where Cole_Crops IS NOT NULL)。

小智 5

这是一个简单的修复方法,在分区子句中使用 case 语句。

CASE 
    WHEN COLUMN_1 IS NULL THEN NULL 
    ELSE PERCENT_RANK() OVER 
        (PARTITION BY 
            CASE 
                WHEN COLUMN_1 IS NULL THEN 0 
                ELSE 1 
            END 
         ORDER BY COLUMN_1) 
END AS RANK_COLUMN_1
Run Code Online (Sandbox Code Playgroud)

这将分别对空值和非空值进行排名,但包装 case 语句会将空值显示为空值。

问题解决了!