Para a tabela de exemplo a seguir, desejo definir classificações para cada grupo, ordenadas por data_de_início_desc, mas quero que o administrador seja sempre definido como classificação 0
nome | data_início | grupo_no |
---|---|---|
Administrador | 2023-01-01 | 0 |
UM | 2021-01-01 | 0 |
B | 2022-01-01 | 0 |
C | 2021-06-01 | 0 |
Administrador | 2021-01-01 | 1 |
UM | 2025-01-01 | 1 |
B | 2020-01-01 | 1 |
C | 2024-01-01 | 1 |
Resultado esperado:
nome | data_início | grupo_no | rnk |
---|---|---|---|
Administrador | 2023-01-01 | 0 | 0 |
B | 2022-01-01 | 0 | 1 |
C | 2021-06-01 | 0 | 2 |
UM | 2021-01-01 | 0 | 3 |
Administrador | 2021-01-01 | 1 | 0 |
UM | 2025-01-01 | 1 | 1 |
C | 2024-01-01 | 1 | 2 |
B | 2020-01-01 | 1 | 3 |
SELECT name, start_date, group_no,
RANK() OVER (PARTITION BY group_no ORDER by start_date DESC) as rnk
FROM Table_Name
ORDER BY rnk;
A consulta acima me dá o seguinte resultado. Existe uma maneira de adicionar uma condição na função rank para definir admin como 0 por padrão e aplicar a função rank a todo o resto.
nome | data_início | grupo_no | rnk |
---|---|---|---|
Administrador | 2023-01-01 | 0 | 1 |
B | 2022-01-01 | 0 | 2 |
C | 2021-06-01 | 0 | 3 |
UM | 2021-01-01 | 0 | 4 |
UM | 2025-01-01 | 1 | 1 |
C | 2024-01-01 | 1 | 2 |
Administrador | 2021-01-01 | 1 | 3 |
B | 2020-01-01 | 1 | 4 |
Também tentei usar a condição case:
SELECT name, start_date, group_no,
CASE WHEN name = 'Admin' THEN 0
ELSE RANK() OVER (PARTITION BY group_no ORDER by start_date DESC)
END as rnk
FROM Table_Name
ORDER BY rnk;
nome | data_início | grupo_no | rnk |
---|---|---|---|
Administrador | 2023-01-01 | 0 | 0 |
B | 2022-01-01 | 0 | 2 |
C | 2021-06-01 | 0 | 3 |
UM | 2021-01-01 | 0 | 4 |
Neste caso, Admin é definido como 0, mas para as linhas subsequentes a classificação começa em 2 em vez de 1.
A outra opção que tenho é usar o seguinte, que funciona, mas existe uma abordagem melhor para isso?
SELECT name, start_date, group_no,
0 as rnk
FROM Table_Name
WHERE name = 'Admin'
UNION
SELECT name, start_date, group_no,
RANK() OVER (PARTITION BY group_no ORDER by start_date DESC) as rnk
FROM Table_Name
WHERE name <> 'Admin'