2

PostgreSQL クエリに問題があります。私は初心者なので、愚かな質問かもしれません:

月に最も長く滞在しているクライアントを見つける必要があります。サブクエリで解決策を見つけようとしましたが、エラーを修正できません。これが私のクエリです:

SELECT klantnr,count(reisnr) as aantal
FROM (SELECT reisnr,klantnr,objectnaam
        FROM Hemelobjecten H INNER JOIN bezoeken b
        USING(objectnaam)
        INNER JOIN deelnames D
        USING(reisnr)
WHERE H.objectnaam = 'Moon') as Query
    WHERE Query.objectnaam = 'Moon' 
    GROUP BY klantnr
    HAVING count(reisnr) = MAX(Query.count(reisnr))

これにより、次のエラーが表示されます: ERROR: schema "query" does not exist

***エラー** *

エラー: スキーマ "クエリ" が存在しません SQL 状態: 3F000

どうすれば修正できますか?

クエリ:

SELECT klantnr,count(klantnr)
        FROM Hemelobjecten H INNER JOIN bezoeken b
        USING(objectnaam)
        INNER JOIN deelnames D
        USING(reisnr)
        WHERE H.objectnaam = 'Moon'
GROUP BY klantnr

私に与えます:

125;1
122;1
124;3
121;4
123;3
126;1

右側の列の値が最も高い行のみが必要です。それが私が使用する理由です

4

2 に答える 2

1

句はHAVINGやりすぎです。サブクエリを記述して正しい MAX 値を決定することもできますが、これを行う方がかなり簡単な場合があります。

ORDER BY count(reisnr) DESC LIMIT 1
于 2013-10-23T12:39:40.857 に答える
0

私見月への旅行の数を数えるために reisnr は必要ありません。(見つかったすべてのレコードは、異なる旅行を構成します)。以下のコードは (かなりかさばりますが、非常に読みやすい) CTE であり、 1 人あたりの月への旅行の合計スコアをカウントし、それらを最終的なクエリで比較して、HAVING句を回避します。

WITH dinges AS (
        SELECT distinct klantnr
                , count(*) as aantal
        FROM Hemelobjecten H 
        INNER JOIN bezoeken b USING(objectnaam)
        INNER JOIN deelnames D USING(reisnr)
        WHERE H.objectnaam = 'Moon'
        GROUP BY klantnr
        )
SELECT klantnr
FROM dinges a
WHERE NOT EXISTS (
        SELECT *
        FROM dinges nx
        WHERE nx.aantal > a.aantal
        );
于 2013-10-23T12:48:48.090 に答える