40

次の 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番目の部分についてはわかりません。

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

-トメク

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

4

3 に答える 3

42

問題は簡単に言えば、クエリの特定の 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))
于 2009-11-25T07:27:22.833 に答える
12

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

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
于 2009-11-25T08:12:55.937 に答える
3

たぶんあなたはこれがもっと簡単だと思うでしょう

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

よろしく
K

于 2009-11-25T19:33:33.290 に答える