2016-10-05 3 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

Там нет никакого способа, чтобы исключить Валу в плотном Rank в настоящее время, если вы не просачиваются где clause..that причина, вы получите ниже результат

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

Это не будет получать строку с 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 

Вы можете изменить порядок в конце в случае необходимости, я установил его для получения желаемых результатов.