DB2 consulta grupo superior por
Pregunta
He estado intentando durante horas pero no puedo GE la consulta, quiero hacer lo siguiente con DB2. De la compañía de tabla y los usuarios tengo la siguiente información de la cantidad de boletos por empresa/usuario
QUERY USING:
SELECT T.USER, COUNT(T.USER) AS QUANITTY, T.COMPANY FROM TICKET T
INNER JOIN COMPANY P ON P.COMPANY = T.COMPANY
GROUP BY (T.USER, T.COMPANY) ORDER BY QUANTITY DESC
El resultado es:
user company quantity
----------------------------------
mark nissn 300
tom toyt 50
steve kryr 80
mark frd 20
tom toyt 120
jose toyt 230
tom nissn 145
steve toyt 10
jose kryr 35
steve frd 100
Este debería ser el resultado (el mejor usuario por empresa)
user company quantity
----------------------------------
mark nissn 300
jose toyt 230
steve frd 100
steve kryr 80
Como puede ver, hay muchos usuarios en una empresa y cada uno tiene diferentes cantidades por empresa, el resultado debe obtener al usuario con la mayor cantidad por empresa. es decir: empresa nissn
Tiene 2 usuarios y cada uno tiene (marca con 300) y (Tom con 145)
Por lo tanto, debería darme el usuario más alto que sería Mark con 300. Lo mismo sería para toyt
, frd
, kryr
. Los necesito todos en una consulta.
Me pregunto si eso es posible en una consulta o si necesitaré crear un procedimiento almacenado.
Solución
Puedes hacer esto con consultas analíticas. Pero ten cuidado. El patrón generalmente funciona para involucrar subconsules anidados. (Uno para producir un conjunto de datos, el siguiente para agregarlo al patrón, el tercero para seleccionar las filas que desea).
En este caso debería verse algo así.
Consulta original.
SELECT T.USER, COUNT(T.USER) AS QUANTITY, T.COMPANY
FROM TICKET T
JOIN COMPANY P
ON P.COMPANY = T.COMPANY
GROUP BY (T.USER, T.COMPANY)
Consulta analítica. (Tenga en cuenta que el s
es nombrar la subconsulta. No he usado DB2, pero el estándar estrictamente no impide que se eliminen, y conozco al menos una base de datos que los requiere).
SELECT user, quantity, company
, RANK () OVER (PARTITION BY company ORDER BY quantity DESC) as r
FROM ( ... previous query ... ) s
Resultado final.
SELECT user, quantity, company
FROM ( ... previous query ... ) t
WHERE r = 1
La consulta combinada es:
SELECT user, quantity, company
FROM (
SELECT user, quantity, company
, RANK () OVER (PARTITION BY company ORDER BY quantity DESC) as r
FROM (
SELECT T.USER, COUNT(T.USER) AS QUANTITY, T.COMPANY
FROM TICKET T
JOIN COMPANY P
ON P.COMPANY = T.COMPANY
GROUP BY (T.USER, T.COMPANY)
) s
) t
WHERE r = 1
Como digo, no he usado DB2. Pero según el estándar SQL, esa consulta debería funcionar.