SQL Server Rank () Cap для каждого столбца - PullRequest
0 голосов
/ 01 марта 2011

У меня есть SQL-запрос, который имеет 3 int столбцы, а затем 3 Rank() функции с partition by, который ранжирует эти 3 столбца.

Вопрос в том, что я хочу ранжировать до 5000 для каждого столбца, а затем остановиться после этого.Есть ли возможность сделать это в одном запросе, не разбивая его на 3 запроса?Я все еще хочу, чтобы ВСЕ данные для первых 3 столбцов, просто хочу, чтобы Rank() столбцы становились нулевыми после 5000.

Каждый раздел получал бы до 5000.

Спасибо

Ответы [ 3 ]

3 голосов
/ 01 марта 2011

Вы можете использовать оператор case.

...
CASE WHEN ROW_NUMBER() OVER (<partition by>) <= 5000 
     THEN <rank function> 
     ELSE NULL 
END
...
1 голос
/ 01 марта 2011

Расширение решения Джо Стефанелли:

;with cte as (
   select a, b, c,
      rank() over (partition by ...) as [r1],
      rank() over (partition by ...) as [r2],
      rank() over (partition by ...) as [r3]
    from your_table
)
select a, b, c,
   case when [r1] <= 5000 then [r1] else null end as [r1]
   case when [r2] <= 5000 then [r1] else null end as [r2]
   case when [r3] <= 5000 then [r1] else null end as [r3]
from cte
0 голосов
/ 21 мая 2012

функция RANK () обрабатывает аналогичные значения как одинаковые ранги и, следовательно, значения NULL получают одинаковый ранг.Поэтому решение было бы использовать ROW_NUMBER ().

...