Sql server SQL Server 2012百分比_秩()排除空值

Sql server SQL Server 2012百分比_秩()排除空值,sql-server,null,Sql Server,Null,在具有多个要排序列的查询中,如何排除影响百分比_排名的空值 SQL Server 2012PERCENT\u RANK()在分发中将空值视为实际值。如果有一列要排序,只需添加where子句(即,where Cole_Crops NOT NULL) 您可以按百分比排名顺序使用case语句。您可以将空值设置为您想要的任何值。下面它将所有空值视为0 SELECT [Cole_Crops], PERCENT_RANK() OVER (PARTITION BY HUC02

在具有多个要排序列的查询中,如何排除影响百分比_排名的空值


SQL Server 2012
PERCENT\u RANK()
在分发中将空值视为实际值。如果有一列要排序,只需添加where子句(即,
where Cole_Crops NOT NULL

您可以按百分比排名顺序使用case语句。您可以将空值设置为您想要的任何值。下面它将所有空值视为0

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

您可以按百分比排列顺序使用case语句。您可以将空值设置为您想要的任何值。下面它将所有空值视为0

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

这里有一个简单的修复方法,在您的partition子句中使用case语句

SELECT [Cole_Crops], 
       PERCENT_RANK() OVER (PARTITION BY HUC02 
                            ORDER BY CASE WHEN [Cole_Crops] IS NULL THEN 0 ELSE [Cole_Crops] END) AS Cole_Crops_PCT_RANK], 
       [Row_Crops], 
       PERCENT_RANK() OVER (PARTITION BY HUC02 
                            ORDER BY CASE WHEN [Row_Crops] IS NULL THEN 0 ELSE [Row_Crops] END) AS Row_Crops_PCT_RANK]            
FROM V012_CDLMAX_09
这将分别对null和非null进行排序,但包装case语句将null值显示为null


问题解决了

这里有一个简单的修复方法,在您的partition子句中使用case语句

SELECT [Cole_Crops], 
       PERCENT_RANK() OVER (PARTITION BY HUC02 
                            ORDER BY CASE WHEN [Cole_Crops] IS NULL THEN 0 ELSE [Cole_Crops] END) AS Cole_Crops_PCT_RANK], 
       [Row_Crops], 
       PERCENT_RANK() OVER (PARTITION BY HUC02 
                            ORDER BY CASE WHEN [Row_Crops] IS NULL THEN 0 ELSE [Row_Crops] END) AS Row_Crops_PCT_RANK]            
FROM V012_CDLMAX_09
这将分别对null和非null进行排序,但包装case语句将null值显示为null


问题解决了

您可以尝试在PARTITION BY子句中添加一个条件:

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

您可以尝试在PARTITION BY子句中添加条件:

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

只是对韦斯的答案稍加修改。应该是:

SELECT [Cole_Crops], 
   PERCENT_RANK() OVER (PARTITION BY [Cole_Crops] is not null, HUC02 
                        ORDER BY [Cole_Crops]) AS Cole_Crops_PCT_RANK], 
   [Row_Crops], 
   PERCENT_RANK() OVER (PARTITION BY [Row_Crops] is not null, HUC02 
                        ORDER BY [Row_Crops]) AS Row_Crops_PCT_RANK]
FROM V012_CDLMAX_09

只是对韦斯的答案稍加修改。应该是:

SELECT [Cole_Crops], 
   PERCENT_RANK() OVER (PARTITION BY [Cole_Crops] is not null, HUC02 
                        ORDER BY [Cole_Crops]) AS Cole_Crops_PCT_RANK], 
   [Row_Crops], 
   PERCENT_RANK() OVER (PARTITION BY [Row_Crops] is not null, HUC02 
                        ORDER BY [Row_Crops]) AS Row_Crops_PCT_RANK]
FROM V012_CDLMAX_09

非常感谢。为了澄清,我希望从分布中完全排除空值,这样它们就不会影响相对排名。例如,n=100(带null)和n=75(不带null)。将NULL转换为另一个值将保持n=100,这将更改所检查值的百分比排序。我希望我完全理解了你的想法。ISNULL([FieldName],0)可以用更少的输入获得相同的结果。但我不确定这是OP想要的@JacamoFinane是否仅对列中的非空值进行排序?您是否希望空记录完全没有排名?是的,希望空记录完全没有排名。当使用where子句对查询中的单个值进行排序时可以实现,但当有30个以上的值需要排序时则会出现问题。我希望避免对每个排名进行单独的查询。谢谢,对不起,你不能不努力工作就这样做。有关更多信息,请参阅此开放连接门票:谢谢。为了澄清,我希望从分布中完全排除空值,这样它们就不会影响相对排名。例如,n=100(带null)和n=75(不带null)。将NULL转换为另一个值将保持n=100,这将更改所检查值的百分比排序。我希望我完全理解了你的想法。ISNULL([FieldName],0)可以用更少的输入获得相同的结果。但我不确定这是OP想要的@JacamoFinane是否仅对列中的非空值进行排序?您是否希望空记录完全没有排名?是的,希望空记录完全没有排名。当使用where子句对查询中的单个值进行排序时可以实现,但当有30个以上的值需要排序时则会出现问题。我希望避免对每个排名进行单独的查询。谢谢,对不起,你不能不努力工作就这样做。有关更多信息,请参阅此OpenConnect票证:我认为这不能直接在select语句中完成。所有窗口函数都针对整个查询结果集运行。我认为这不能直接在select语句中完成。所有窗口函数都针对整个查询结果集运行。