2016-10-05 7 views
0

次の表があるとします。行を除いたSQLランク()関数

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 

しかし、結果は次のようになります。それを達成する方法?あなたはclause..thatが理由である場合にはフィルタリングしない限り、現在の高密度ランクでヴァルを排除する方法はありません

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

答えて

4

VAL列がNULL可能でない場合、アカウントのNULLを考慮すると、これは200の値を持つ行をフェッチしないであろう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

、あなたは結果

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

の下に取得するあなたは一度フィルタリングする必要があるでしょうし、その後、あまりにも、すべての

;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

の最後の値です。しかし、私はその行を含めることを願っています。 – 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 

最後に注文を変更することができますステートメントは必要に応じて、私はあなたの希望の結果を生成するように設定します。