2016-11-29 92 views
1

我從我寫的一個長查詢中得到下面的摘錄。我試圖創建一個Rank函數來排名,因此我可以使用子查詢進行篩選SQL Server 2008排名最後的空值

如何利用排名空白和null排在最後?

排名

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 
+0

你能給你預期的產出嗎?我的意思是,人們會先走哪條規則?你訂購哪一列? – DVT

+0

已更新的問題。希望看到空格和空位在Dense_Rank排名最後的排名 – Toby

+0

您是否遇到問題以正確的順序讓他們或給他們排名? – Fritz

回答

3
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值,如果空使它比不爲空更大的值。對CategoryReview這樣做。如果你想聯繫開關ROW_NUMBER()DENSE_RANK()。通過信息添加分區和其他順序以優化更多測試用例。

在你的CASE表達式,你可以做各種事情一樣,如果你想第二排序空值絕對去年和空白(空字符串)到最後,你可以做這樣的事情

CASE 
    WHEN Review IS NULL THEN 2 --Nulls last 
    WHEN Review = '' THEN 1 -- Empty String 2nd To Last 
    ELSE 0 -- 
END 
+1

由於列可以是NULL或空白,也許使用'coalesce ... ='''? – scsimon

+1

@scsimon好點將改變謝謝! – Matt

0
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 
+0

你也可以使用ROWNUMBER(),具體取決於。 – DVT

0

如果您按desc排序,空值將最後出現。

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