Используйте комбинацию аналитических функций ROW_NUMBER()
и COUNT()
:
Установка Oracle :
CREATE TABLE table_name ( Name, Target ) As
SELECT 'John', 2500 FROM DUAL UNION ALL
SELECT 'Hopkins', 4000 FROM DUAL UNION ALL
SELECT 'Paul', 5000 FROM DUAL UNION ALL
SELECT 'Gracia', 5200 FROM DUAL;
Запрос :
SELECT t.*,
ROW_NUMBER() OVER ( ORDER BY target ASC )
- COUNT( CASE WHEN target < 5000 THEN 1 END ) OVER ()
- 1 AS rnk
FROM table_name t;
выход
NAME | TARGET | RNK
:------ | -----: | --:
John | 2500 | -2
Hopkins | 4000 | -1
Paul | 5000 | 0
Gracia | 5200 | 1
дБ <> скрипка здесь
Обновление
Установка Oracle :
CREATE TABLE table_name ( Name, Target ) As
SELECT 'John', 2500 FROM DUAL UNION ALL
SELECT 'Hopkins', 4000 FROM DUAL UNION ALL
SELECT 'Bob', 5000 FROM DUAL UNION ALL
SELECT 'Smith', 5000 FROM DUAL UNION ALL
SELECT 'Paul', 5100 FROM DUAL UNION ALL
SELECT 'Janet', 5100 FROM DUAL UNION ALL
SELECT 'Gracia', 5200 FROM DUAL;
Запрос 1 : если вы хотите получить уникальный ранг для каждой строки и не хотите ранг 0, если нет значения 5000:
SELECT t.*,
ROW_NUMBER() OVER ( ORDER BY target ASC, name ASC )
- COUNT( CASE WHEN target < 5000 THEN 1 END ) OVER ()
- CASE WHEN target > 5000 AND COUNT( CASE WHEN target = 5000 THEN 1 END ) OVER () = 0 THEN 0 ELSE 1 END AS rnk
FROM table_name t;
выход
NAME | TARGET | RNK
:------ | -----: | --:
John | 2500 | -2
Hopkins | 4000 | -1
Bob | 5000 | 0
Smith | 5000 | 1
Janet | 5100 | 2
Paul | 5100 | 3
Gracia | 5200 | 4
Запрос 2 : если вы хотите, чтобы строки с одной и той же целью имели одинаковый ранг и имели цели только с 5000, ранг 0:
SELECT name,
target,
DENSE_RANK() OVER ( ORDER BY target ASC )
- COUNT( CASE WHEN target < 5000 AND rn = 1 THEN 1 END ) OVER ()
- CASE WHEN target > 5000 AND COUNT( CASE WHEN target = 5000 AND rn = 1 THEN 1 END ) OVER () = 0 THEN 0 ELSE 1 END AS rnk
FROM (
SELECT t.*,
ROW_NUMBER() OVER ( PARTITION BY target ORDER BY name ) AS rn
FROM table_name t
);
выход
NAME | TARGET | RNK
:------ | -----: | --:
John | 2500 | -2
Hopkins | 4000 | -1
Bob | 5000 | 0
Smith | 5000 | 0
Janet | 5100 | 1
Paul | 5100 | 1
Gracia | 5200 | 2
дБ <> скрипка здесь