SQL no es una función de grupo de un solo grupo


Cuando corro la siguiente instrucción SQL:

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

Devuelve el valor máximo de la suma de descargas de un cliente, sin embargo, si intento encontrar el número de seguro social al que pertenece ese valor máximo agregándolo a la declaración select:

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

Obtengo el siguiente error:

No es una función de grupo de un solo grupo

No entiendo por qué está lanzando este error. Una búsqueda de Google llegó con la siguiente acción:

Deje caer la agrupar la función o la expresión de columna individual de la lista SELECCIONAR o agregar una cláusula AGRUPAR POR que incluya todas las expresiones de columna individuales listadas

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

¿Podría alguien guiar en la dirección correcta?

-Tomek

EDITAR: EL TIEMPO en esta base de datos se refiere al número de veces descargado

Author: CydrickT, 2009-11-25

3 answers

Bueno, el problema simplemente es que la SUMA(TIEMPO) para un SSN específico en su consulta es un solo valor, por lo que está objetando a MAX ya que no tiene sentido (El máximo de un solo valor no tiene sentido).

No estoy seguro de qué servidor de base de datos SQL está utilizando, pero sospecho que desea una consulta más como esta (Escrito con un fondo MSSQL - puede necesitar alguna traducción 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 tiempo total más alto y el tiempo total para se.

Editar-Si tienes múltiples con un tiempo igual y los quieres todos utilizarías:

SELECT
SSN, SUM(TIME)
FROM downloads
GROUP BY SSN
HAVING SUM(TIME)=(SELECT MAX(SUM(TIME)) FROM downloads GROUP BY SSN))
 35
Author: fyjham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-25 07:58:16

Si desea un número de descargas para cada cliente, utilice:

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

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

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

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

select *
  from (
        select ssn
             , sum(time)
             , dense_rank() over (order by sum(time) desc) r
          from downloads
         group by ssn
       )
 where r = 1
 10
Author: Egor Rogov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-25 20:15:19

Tal vez encuentres esto más simple

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

Saludos
K

 2
Author: Khb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-25 19:33:33