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é
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))
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
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