1. ホーム
  2. sql

[解決済み】SQLが単一グループのグループ関数でないこと

2022-02-06 16:25:38

質問

以下のSQL文を実行すると

SELECT MAX(SUM(TIME))
FROM downloads
GROUP BY SSN

ある顧客のダウンロード数の最大値を返しますが、その最大値が属する社会保障番号をselect文に追加して探そうとすると、以下のようになります。

SELECT SSN, MAX(SUM(TIME))
FROM downloads
GROUP BY SSN

以下のようなエラーが発生します。

単一グループのグループ関数ではありません

なぜこのエラーを投げるのか理解できません。ググってみると、以下のような動作が出てきました。

SELECT リストからグループ関数または個々の列式のいずれかを削除するか、リストされたすべての個々の列式を含む GROUP BY 節を追加します。

私が思うに、これは - グループ関数を削除すると、合計値が無効になります。 - 個々の列式 (SSN) を削除すると、最大値の合計が返されるだけです。 - 3番目の部分はよくわかりません。

どなたか正しい方向性を示していただけませんか?

-トメック

EDIT: このデータベースにおけるTIMEとは、ダウンロードされた回数のことです。

解決するには?

簡単に言うと、クエリの特定のSSNに対するSUM(TIME)は単一の値なので、MAXは意味がない(単一の値の最大値は意味がない)ので、異議を唱えているのです。

どの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))