/ / rank () y over () en consultas Oracle - SQL, Oracle, funciones de ventana

Rango () y más () en consultas de Oracle: SQL, Oracle, funciones de ventana

Necesito entender la diferencia entre estas dos consultas de Oracle especialmente entre rank() over(order by length(cgp.group_name) desc) y rank() over(order by length(cgp.group_name), length(csc.subscriber_num) desc) ranking.

Busqué en google con respecto al rango y entendí a continuación:

rank() over(order by length(cgp.group_name), length(csc.subscriber_num) desc) ranking : una columna de clasificación mostrar en el resultado con valores 1,2,3 según la coincidencia máxima de nombre_grupo.

select csc.subscriber_num csc.group_id,
rank() over(order by length(cgp.group_name) desc) ranking
from scallforward_info csc ,
gprofile cgp
where "0120111" like csc.subscriber_num||"%"
and   GROUP_NAME like "TEST" ||"%"
and csc.account_number=99995555
and   csc.group_id= cgp.group_id
and csc.ver = 1
and cgp.ver = 1;


select csc.subscriber_num csc.group_id,
rank() over(order by length(cgp.group_name), length(csc.subscriber_num)  desc) ranking
from scallforward_info csc ,
gprofile cgp
where "0120111" like csc.subscriber_num||"%"
and GROUP_NAME like "TEST" ||"%"
and   csc.account_number=99995555
and csc.group_id= cgp.group_id
and   csc.ver = 1
and cgp.ver = 1;

Respuestas

1 para la respuesta № 1
rank() over(order by length(cgp.group_name) desc)

Dará a cada fila un rango numérico en orden de la longitud del valor en el cgp.group_name columna en DESC orden (más largo a más corto) y no intentará romper los lazos.

rank() over(order by length(cgp.group_name), length(csc.subscriber_num) desc)

Dará a cada fila un rango numérico en orden de la longitud del valor en el cgp.group_name columna en ASC orden (más corta a más larga) e intentará romper los lazos utilizando la longitud del valor en el csc.subscriber_num en DESC orden (más largo a más corto).


1 para la respuesta № 2

Para ver la diferencia, aquí hay una consulta que se ejecutaen comparación con algunos datos de muestra (si no conoce el factorización de subconsultas (también conocido como "la cláusula con", también conocido como expresiones de tabla comunes, también conocido como CTE), le recomiendo que lo investigue)

with sample_data as (select 1 id, 1 val1, 1 val2, 13 val3 from dual union all
select 2 id, 1 val1, 2 val2, 12 val3 from dual union all
select 3 id, 1 val1, 3 val2, 11 val3 from dual union all
select 4 id, 1 val1, 4 val2, 10 val3 from dual union all
select 5 id, 2 val1, 4 val2, 9 val3 from dual union all
select 6 id, 2 val1, 3 val2, 8 val3 from dual union all
select 7 id, 2 val1, 2 val2, 7 val3 from dual union all
select 8 id, 2 val1, 1 val2, 6 val3 from dual union all
select 9 id, 3 val1, 2 val2, 5 val3 from dual union all
select 10 id, 3 val1, 6 val2, 4 val3 from dual union all
select 11 id, 3 val1, 2 val2, 3 val3 from dual union all
select 12 id, 4 val1, 7 val2, 2 val3 from dual union all
select 13 id, 4 val1, 8 val2, 1 val3 from dual)
select id,
val1,
val2,
val3,
rank() over (order by val1) rank1,
rank() over (order by val1, val2) rank2,
dense_rank() over (order by val1) dense_rank1,
dense_rank() over (order by val1, val2) dense_rank2
from   sample_data;


ID       VAL1       VAL2       VAL3      RANK1      RANK2 DENSE_RANK1 DENSE_RANK2
---------- ---------- ---------- ---------- ---------- ---------- ----------- -----------
1          1          1         13          1          1           1           1
2          1          2         12          1          2           1           2
3          1          3         11          1          3           1           3
4          1          4         10          1          4           1           4
8          2          1          6          5          5           2           5
7          2          2          7          5          6           2           6
6          2          3          8          5          7           2           7
5          2          4          9          5          8           2           8
9          3          2          5          9          9           3           9
11          3          2          3          9          9           3           9
10          3          6          4          9         11           3          10
12          4          7          2         12         12           4          11
13          4          8          1         12         13           4          12

Además, según la documentación:

Las filas con valores iguales para los criterios de clasificación reciben el mismo rango.

Junte los dos y, con suerte, podrá ver que debido a que tiene filas que comparten los mismos valores en todas las columnas en el orden por cláusula, tienen el mismo valor de rango.

P.ej. En el resultado de la consulta anterior, las filas con id en (1,2,3,4) tienen un rango1 de 1, mientras que los identificadores 9 y 11 tienen el mismo rango2, pero el id 10 tiene un rango diferente) Entonces, cuanto más según sus criterios de clasificación, es menos probable que reciba lazos (en general).

Eso responde tu pregunta? También he incluido el equivalente DENSE_RANK funciona en la consulta anterior, para que pueda ver la diferencia en la numeración de rango.