2016-10-05 35 views
0

請考慮我擁有下表。不包括行的SQL Rank()函數

ID value 
1 100 
2 200 
3 200 
5 250 
6 1 

我有以下查詢給出瞭如下結果。我想從排名函數中排除值200,但仍然必須返回該行。

SELECT 
CASE WHEN Value = 200 THEN 0 
    ELSE DENSE_RANK() OVER (ORDER BY VALUE DESC) 
END AS RANK, 
ID, 
VALUE 
FROM @table 

RANK ID VALUE 
1  5 250 
0  2 200 
0  3 200 
4  1 100 
5  6 1 

但我想要的結果如下。如何實現它?

RANK ID VALUE 
1  5 250 
0  2 200 
0  3 200 
2  1 100 
3  6 1 

回答

4

如果VAL列不能爲空,考慮到NULL是ORDER BY .. DESC

select *, dense_rank() over (order by nullif(val,200) desc) * case val when 200 then 0 else 1 end 
from myTable 
order by val desc; 
+0

優秀的解決方案 – TheGameiswar

+0

工作查詢..試試這個 –

+0

偉大的查詢!好工作 –

0

有沒有辦法在密集等級排除瓦爾目前,除非你在clause..that的原因過濾,你就會得到如下結果

RANK ID VALUE 
1  5 250 
0  2 200 
0  3 200 
4  1 100 
5  6 1 

您將需要過濾一次,然後做一個UNION ALL

;with cte(id,val) 
as 
(
select 1, 100 union all 
select 2, 200 union all 
select 3, 200 union all 
select 5, 250 union all 
select 6, 1 ) 
select *, dense_rank() over (order by val desc) 
from cte 
where val<>200 
union all 
select 0,id,val from cte where val=200 
+0

這最後的值不會與200的值讀取該行。但我想要包含這一行。 – DotNetLearner

+0

它是與工會所有,最後 – TheGameiswar

0

你也可以試試這個,太:

SELECT ISNULL(R, 0) AS Rank ,t.id ,t.value 
FROM tbl1 AS t 
    LEFT JOIN (SELECT id ,DENSE_RANK() OVER (ORDER BY value DESC) AS R 
       FROM dbo.tbl1 WHERE value <> 200 
      ) AS K 
    ON t.id = K.id 
ORDER BY t.value DESC 
從排名
0

你可以到您要包括的值單獨的查詢拆分排名/排除和UNION ALL結果像這樣:

獨立的可執行文件例如:

CREATE TABLE #temp ([ID] INT, [value] INT); 

INSERT INTO #temp 
     ([ID], [value]) 
VALUES (1, 100), 
     (2, 200), 
     (3, 200), 
     (5, 250), 
     (6, 1); 

SELECT * 
FROM (SELECT 0 RANK , 
        ID , 
        value 
      FROM  #temp 
      WHERE  value = 200 -- set rank to 0 for value = 200 
      UNION ALL 
      SELECT DENSE_RANK() OVER (ORDER BY value DESC) AS RANK , 
        ID , 
        value 
      FROM  #temp 
      WHERE  value != 200 -- perform ranking on records != 200 
     ) t 
ORDER BY value DESC , 
     t.ID 

DROP TABLE #temp 

可生產:

RANK ID value 
1  5 250 
0  2 200 
0  3 200 
2  1 100 
3  6 1 

您可以在最後修改排序聲明如果需要,我將其設置爲產生您想要的結果。