¿Alguien puede explicar qué hace la partition by
palabra clave y dar un ejemplo simple de ella en acción, así como por qué uno querría usarla? Tengo una consulta SQL escrita por otra persona y estoy tratando de averiguar qué hace.
Un ejemplo de partición por:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
Los ejemplos que he visto en línea parecen demasiado profundos.
sql
oracle
window-functions
Alex Beardsley
fuente
fuente
Respuestas:
La
PARTITION BY
cláusula establece el rango de registros que se utilizarán para cada "GRUPO" dentro de laOVER
cláusula.En su ejemplo SQL,
DEPT_COUNT
devolverá el número de empleados dentro de ese departamento para cada registro de empleado. (Es como si des-nominalizara laemp
tabla; todavía devuelve todos los registros de laemp
tabla).Si hubiera otra columna (p. Ej.
state
) , Entonces podría contar cuántos departamentos en ese estado.Es como conseguir los resultados de un
GROUP BY
(SUM
,AVG
, etc.) sin la agregación del conjunto de resultados (es decir, la eliminación de registros coincidentes).Es útil cuando usa las funciones
LAST OVER
oMIN OVER
para obtener, por ejemplo, el salario más bajo y más alto en el departamento y luego lo usa en un cálculo contra este salario de registros sin una subselección, que es mucho más rápido.Lea el artículo de AskTom vinculado para obtener más detalles.
fuente
last over
ymin over
. Me imagino que una selección secundaria sería más lenta, pero la gramática inglesa en la respuesta no sugiere eso.El concepto está muy bien explicado por la respuesta aceptada, pero creo que cuanto más ejemplo se ve, mejor se asimila. Aquí hay un ejemplo incremental:
1) El jefe dice "dame la cantidad de artículos que tenemos en stock agrupados por marca"
Usted dice : "no hay problema"
Resultado:
2) El jefe dice "Ahora consígueme una lista de todos los artículos, con su marca Y la cantidad de artículos que tiene la marca respectiva"
Puedes probar:
Pero obtienes:
Aquí es donde
OVER (PARTITION BY BRAND)
entra el:¿Qué significa:
COUNT(ITEM_ID)
- obtener el número de artículosOVER
- Sobre el conjunto de filas(PARTITION BY BRAND)
- que tienen la misma marcaY el resultado es:
etc ...
fuente
Es la extensión SQL llamada análisis. El "over" en la instrucción select le dice a Oracle que la función es una función analítica, no un grupo por función. La ventaja de usar el análisis es que puede recopilar sumas, recuentos y mucho más con solo pasar los datos en lugar de recorrerlos con subselecciones o, peor aún, PL / SQL.
Al principio parece confuso, pero será una segunda naturaleza rápidamente. Nadie lo explica mejor que Tom Kyte. Entonces el enlace de arriba es genial.
Por supuesto, leer la documentación es imprescindible.
fuente
Aquí estamos contando para el departamento respectivo. En cuanto al departamento 10 tenemos 4 registros en la tabla con resultados similares para los departamentos 20 y 30 también.
fuente
la palabra clave sobre partición es como si estuviéramos particionando los datos mediante la creación de client_id un subconjunto de cada ID de cliente
esta consulta devolverá el número de operaciones realizadas por client_id
fuente
Creo que este ejemplo sugiere un pequeño matiz sobre cómo funciona la partición y cómo funciona agrupar por. Mi ejemplo es de Oracle 12, si resulta que es un error de compilación.
Lo intenté :
Sin embargo, esto funciona como se esperaba:
Produciendo el número de elementos en cada estado basado en la clave externa "data_key". Entonces, si data_key = 'APPLE' tuviera 3 filas con el estado 'A', 2 filas con el estado 'B', una fila con el estado 'C', la fila correspondiente para 'APPLE' sería 'APPLE', 3, 2 , dieciséis.
fuente