web-dev-qa-db-fra.com

SQL pas une fonction de groupe unique

Lorsque j'exécute l'instruction SQL suivante:

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

Il renvoie la valeur totale des téléchargements effectués par un client. Toutefois, si j'essaie de trouver le numéro de sécurité sociale auquel cette valeur maximale appartient, ajoutez-le à l'instruction select:

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

Je reçois l'erreur suivante:

pas une fonction de groupe unique

Je ne comprends pas pourquoi il jette cette erreur. Une recherche sur Google a abouti à l'action suivante:

Supprimez la fonction de groupe ou l'expression de colonne individuelle de la liste SELECT ou ajoutez une clause GROUP BY incluant toutes les expressions de colonne individuelles répertoriées.

D'après ce que je pense, cela signifie que la suppression de la fonction group rend la valeur de somme invalide. Si vous supprimez l'expression de colonne individuelle (SSN), vous obtiendrez simplement la somme maximale - je ne suis pas sûr de cette troisième partie.

Quelqu'un pourrait-il guider dans la bonne direction?

-Tomek

EDIT: TIME dans cette base de données fait référence au nombre de fois téléchargé

35
Tomek

Eh bien, le problème est simplement que le SUM (TIME) d'un SSN spécifique sur votre requête est une valeur unique, de sorte qu'il s'oppose à MAX car cela n'a aucun sens (le maximum d'une valeur unique n'a pas de sens).

Vous ne savez pas quel serveur de base de données SQL vous utilisez, mais je suppose que vous souhaitez une requête plus semblable à celle-ci (Écrit avec un arrière-plan MSSQL - il faudra peut-être le traduire sur le serveur SQL que vous utilisez):

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

Cela vous donnera le SSN avec le temps total le plus élevé et le temps total correspondant.

Éditer - Si vous avez plusieurs fois le même temps et que vous les voulez tous, vous utiliseriez:

SELECT
SSN, SUM(TIME)
FROM downloads
GROUP BY SSN
HAVING SUM(TIME)=(SELECT MAX(SUM(TIME)) FROM downloads GROUP BY SSN))
35
fyjham

Si vous voulez un nombre de téléchargements pour chaque client, utilisez:

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

Si vous voulez juste un enregistrement - pour un client avec le plus grand nombre de téléchargements - utilisez:

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

Toutefois, si vous souhaitez voir tous les clients ayant le même nombre de téléchargements et partageant la position la plus élevée, utilisez:

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

Peut-être trouvez-vous cela plus simple

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

Cordialement
K

2
Khb