2016-11-29 3 views
1

Ich habe den folgenden Auszug aus einer langen Abfrage, die ich geschrieben habe. Ich versuche, eine Rank-Funktion zu ranken, so dass ich dann mit einer UnterabfrageSQL Server 2008 Rang mit null zuletzt

filtern kann Wie würde man Rang verwenden, wo Leerzeichen und Null würde als letztes eingestuft werden?

Rang

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

Erwartete Ausgabe:

id Category  Review   Rnk 
1  Site   "null value"  3 
1  "blank value"  Yes    2 
1  Sited   Yes    1 
+0

Können Sie Ihre erwartete Ausgabe geben? Ich meine, die Regel, von der man zuerst gehen würde? In welcher Spalte sortieren Sie? – DVT

+0

aktualisierte Frage. Möchte einen Rang sehen, wo Leerzeichen und Nullen zuletzt in Dense_Rank platziert wurden – Toby

+0

Haben Sie Probleme, sie in die richtige Reihenfolge zu bringen oder ihnen den Rang zuzuweisen? – Fritz

Antwort

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 

Verwenden Sie ein CASE-Ausdrücke für NULL-Werte in den Feldern zu testen und wenn null machen es einen größeren Wert als nicht null. Tun Sie dies für Category und Review. Wenn Sie Krawatten wollen, wechseln Sie ROW_NUMBER() zu DENSE_RANK(). Fügen Sie Partition und andere Reihenfolge nach Informationen hinzu, um weitere Testfälle zu verfeinern.

in Ihrem Fall Ausdrücke können Sie alle möglichen Dinge tun, wie wenn Sie NULL-Werte absolut letzte und Leerzeichen (leere Zeichenkette) an zweiter Stelle sortieren möchten Sie dauern etwas wie

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

Da die Spalten NULL oder leer sein können, verwenden Sie 'coalesce ... = '''? – scsimon

+1

@scsimon guter Punkt wird sich ändern, danke! – 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

Sie können ROWNUMBER() auch verwenden, abhängig von den spezifischen. – DVT

0

Wenn Sie das tun könnte um by desc werden die Nullen als letzte auftauchen.

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