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 更大的值。为 Category
和 Review
执行此操作。如果你想要领带切换 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
我从我写的一个长查询中摘录了以下内容。我正在尝试创建一个排名函数来排名,这样我就可以使用子查询进行过滤
如何利用空白和空值排在最后的排名?
排名
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 更大的值。为 Category
和 Review
执行此操作。如果你想要领带切换 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