SQL Server 2008 排名最后为 Null

SQL Server 2008 Rank with Nulls last

我从我写的一个长查询中摘录了以下内容。我正在尝试创建一个排名函数来排名,这样我就可以使用子查询进行过滤

如何利用空白和空值排在最后的排名?

排名

id    Category        Review
 1      Site           "null value"
 1     "blank value"      Yes
 1     Sited            Yes

预期输出:

id    Category        Review            Rnk
 1      Site           "null value"       3
 1     "blank value"      Yes             2
 1     Sited            Yes               1
DECLARE @Table AS TABLE (Id INT, Category VARCHAR(15), Review VARCHAR(15))
INSERT INTO @Table VALUES (1,'Site',NULL),(1,NULL,'Yes'),(1,'Sited','Yes')

SELECT
    Id
    ,Category
    ,Review
    ,Rnk = ROW_NUMBER() OVER (ORDER BY
          CASE WHEN ISNULL(Review,'') = '' THEN 1 ELSE 0 END
          ,CASE WHEN ISNULL(Category,'') = '' THEN 1 ELSE 0 END)
FROM
    @Table
ORDER BY
    Rnk DESC

使用 CASE 表达式测试字段中的 NULL 值,如果为 null,则使其成为比非 null 更大的值。为 CategoryReview 执行此操作。如果你想要领带切换 ROW_NUMBER()DENSE_RANK()。添加分区和其他按信息排序以优化更多测试用例。

在你的 Case 表达式中,你可以做各种事情,比如如果你想绝对最后排序 Nulls 和倒数第二个空白(空字符串)你可以做类似的事情

CASE
  WHEN Review IS NULL THEN 2 --Nulls last
  WHEN Review = '' THEN 1 -- Empty String 2nd To Last
  ELSE 0 --
END
SELECT
    a.id
    , a.Category
    , a.Review
    , RANK() OVER (ORDER BY a.CategoryRank DESC, a.Category, a.Review DESC, a.Review) AS Rnk
FROM
    (
    SELECT 
        id, Category, Review,
        CASE
            WHEN Category IS NULL THEN 0
            ELSE 1
        END AS CategoryRank,
        CASE
            WHEN Review='' THEN 0
            ELSE 1
        END AS ReviewRank       
    ) a

如果按 desc 排序,null 将最后出现。

DENSE_RANK () OVER (PARTITION BY ID, REVIEW ORDER BY F.TypeOfReview desc, OnSiteChoices desc) Rnk