SQL - это не групповая групповая функция
Когда я запускаю следующий оператор SQL:
SELECT MAX(SUM(TIME))
FROM downloads
GROUP BY SSN
Он возвращает максимальное значение суммы загрузки клиентом, однако, если я попытаюсь найти номер социального обеспечения, к которому принадлежит это максимальное значение, добавив его в оператор select:
SELECT SSN, MAX(SUM(TIME))
FROM downloads
GROUP BY SSN
Я получаю следующую ошибку:
не групповая групповая функция
Я не понимаю, почему он выбрасывает эту ошибку. В результате поиска Google появилось следующее действие:
Отбросьте либо групповую функцию, либо отдельное выражение столбца из списка SELECT или добавьте предложение GROUP BY, которое включает все отдельные выражения столбцов, перечисленные
Из того, что я думаю, это говорит
- отбрасывание функции группы делает недопустимым значение суммы
- отбрасывание отдельного выражения столбца (SSN) просто даст мне максимальную сумму
- не уверен в этой третьей части.
Может ли кто-нибудь руководствоваться в правильном направлении?
-Tomek
EDIT: TIME в этой базе данных относится к количеству загруженных раз.
Ответы
Ответ 1
Хорошо, что проблема просто заключается в том, что SUM (TIME) для определенного SSN в вашем запросе является единственным значением, поэтому он против MAX, поскольку это не имеет смысла (максимум одного значения не имеет смысла).
Не уверен, какой сервер базы данных SQL вы используете, но я подозреваю, что вы хотите, чтобы запрос был более похож на этот (написанный с фоном MSSQL - может потребоваться некоторый перевод на сервер sql, который вы используете):
SELECT TOP 1 SSN, SUM(TIME)
FROM downloads
GROUP BY SSN
ORDER BY 2 DESC
Это даст вам SSN с наивысшим общим временем и общим временем для него.
Изменить. Если у вас есть несколько с равным временем и хотите, чтобы все они использовались:
SELECT
SSN, SUM(TIME)
FROM downloads
GROUP BY SSN
HAVING SUM(TIME)=(SELECT MAX(SUM(TIME)) FROM downloads GROUP BY SSN))
Ответ 2
Если вам нужен номер загрузки для каждого клиента, используйте:
select ssn
, sum(time)
from downloads
group by ssn
Если вам нужна только одна запись - для клиента с наибольшим количеством загрузок - используйте:
select *
from (
select ssn
, sum(time)
from downloads
group by ssn
order by sum(time) desc
)
where rownum = 1
Однако, если вы хотите, чтобы все клиенты имели одинаковое количество загрузок, которые имеют самую высокую позицию, используйте:
select *
from (
select ssn
, sum(time)
, dense_rank() over (order by sum(time) desc) r
from downloads
group by ssn
)
where r = 1
Ответ 3
Возможно, вы найдете этот более простой
select * from (
select ssn, sum(time) from downloads
group by ssn
order by sum(time) desc
) where rownum <= 10 --top 10 downloaders
С уважением
К