Подтвердить что ты не робот

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 в этой базе данных относится к количеству загруженных раз.

4b9b3361

Ответ 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

С уважением
К