web-dev-qa-db-ja.com

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)を削除すると最大合計が得られます-その3番目の部分についてはわかりません。

誰かが正しい方向に導くことができますか?

-トメック

編集:このデータベースの時間は、ダウンロードされた回数を指します

35
Tomek

単純に問題は、クエリの特定のSSNのSUM(TIME)が単一の値であるため、意味がないので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))
35
fyjham

各顧客のダウンロード数が必要な場合は、次を使用します。

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

ダウンロード数が最も多い顧客向けに1つのレコードのみが必要な場合は、次を使用します。

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
10
Egor Rogov

たぶん、あなたはこれをより簡単に見つけます

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

よろしく
K

2
Khb