次の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番目の部分についてはわかりません。
誰かが正しい方向に導くことができますか?
-トメック
編集:このデータベースの時間は、ダウンロードされた回数を指します
単純に問題は、クエリの特定の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))
各顧客のダウンロード数が必要な場合は、次を使用します。
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
たぶん、あなたはこれをより簡単に見つけます
select * from (
select ssn, sum(time) from downloads
group by ssn
order by sum(time) desc
) where rownum <= 10 --top 10 downloaders
よろしく
K