2009-11-25 11 views
32

Cuando ejecute la siguiente instrucción SQL:no SQL una función de grupo de un solo grupo

SELECT MAX(SUM(TIME)) 
FROM downloads 
GROUP BY SSN 

Devuelve el valor máximo suma de las descargas por un cliente, sin embargo, si trato de encontrar el número de la seguridad social que esa valor máximo pertenece a añadiéndolo a la instrucción de selección:

SELECT SSN, MAX(SUM(TIME)) 
FROM downloads 
GROUP BY SSN 

me sale el siguiente error:

not a single-group group function

No entiendo por qué está arrojando este error. Una búsqueda en Google se le ocurrió la siguiente acción:

gota o bien la función de grupo o la expresión columna individual de la lista SELECT o añadir una cláusula GROUP BY que incluye todas las expresiones de columna individuales enumerados

Por lo que creo que esto está diciendo - soltar la función de grupo hace que el valor de suma sea inválido - droping la expresión de columna individual (SSN) me dará la suma máxima - no estoy seguro acerca de esa tercera parte.

¿Alguien podría guiar en la dirección correcta?

-Tomek

EDIT: TIME en esta base de datos se refiere al número de veces descargado

Respuesta

34

Bueno el problema simplemente-puso es que la suma (TIEMPO) para un SSN específico en su consulta es una sola valor, por lo que se opone a MAX ya que no tiene sentido (el máximo de un solo valor no tiene sentido).

No estoy seguro servidor de base de datos SQL lo está utilizando, pero sospecho que desea una consulta de la misma familia (Escrito con un fondo de MSSQL - puede necesitar algunas traducciones al servidor SQL que está utilizando):

SELECT TOP 1 SSN, SUM(TIME) 
FROM downloads 
GROUP BY SSN 
ORDER BY 2 DESC 

Esto le dará el SSN con el mayor tiempo total y el tiempo total para ello.

Editar - Si tiene múltiples con un tiempo igual y se los quiere usted utilizaría:

SELECT 
SSN, SUM(TIME) 
FROM downloads 
GROUP BY SSN 
HAVING SUM(TIME)=(SELECT MAX(SUM(TIME)) FROM downloads GROUP BY SSN)) 
+0

Estoy utilizando Oracle y no estoy familiarizado con agarrar filas específicas.Sin embargo, ¿qué pasa si hay clientes que están atados por tener la cantidad máxima de descargas? – Tomek

+0

Si hubiera múltiples con la misma cantidad, esencialmente sería al azar lo que obtuviste (Probablemente haya un pedido en un nivel bajo, pero no lo sabría ni confiaría en él). Puede agregar cláusulas adicionales al pedido si desea especificar cómo ordenarlo usted mismo. Si quieres vincular a todos los primeros, creo que necesitarás consultas anidadas, una para obtener el tiempo máximo y otro para retirar todos los que lo cumplan (Algo así como "SELECCIONAR SSN, SUM (TIME) FROM descargas GRUPO POR SSN TENIENDO SUMA (TIEMPO) = (SELECCIONE MAX (SUMA (TIEMPO)) DESDE descargas GROUP BY SSN)) ") – fyjham

+0

PD: No estoy 100% seguro de si HAVING existe en Oracle - alguien más puede aclarar eso. La mayoría de mi experiencia es TSQL. – fyjham

10

Si quieren descargas número para cada cliente, uso:

select ssn 
    , sum(time) 
    from downloads 
group by ssn 

Si desea solo un registro: para un cliente con el mayor número de descargas, use:

select * 
    from (
     select ssn 
      , sum(time) 
      from downloads 
     group by ssn 
     order by sum(time) desc 
     ) 
where rownum = 1 

Sin embargo, si nt para ver todos los clientes con el mismo número de descargas, que comparten la posición más alta, utilice:

select * 
    from (
     select ssn 
      , sum(time) 
      , dense_rank() over (order by sum(time) desc) r 
      from downloads 
     group by ssn 
     ) 
where r = 1 
+0

Su segundo ejemplo le daría el cliente con el número más bajo a menos que su orden sea al descender – Khb

+0

Khb, tiene razón. Lo he corregido –

2

Tal vez se encuentra este sencillo

select * from (
    select ssn, sum(time) from downloads 
    group by ssn 
    order by sum(time) desc 
) where rownum <= 10 --top 10 downloaders 

Saludos
K

Cuestiones relacionadas