18

このクエリを実行するとエラーが発生します

SELECT date(updated_at), count(updated_at) as total_count 
FROM "persons"
WHERE ("persons"."updated_at" BETWEEN '2012-10-17 00:00:00.000000' AND '2012-11-07     12:25:04.082224') 
GROUP BY date(updated_at)
ORDER BY persons.updated_at DESC

エラー ERROR: column "persons.updated_at" must appear in the GROUP BY clause or be used in a aggregate function LINE 5: ORDER BY person.updated_at DESC が表示されます

これは、グループ呼び出しから date( 関数を削除すると機能しますが、datetime ではなく日付でグループ化したいため、date 関数を使用しています。

何か案は

4

2 に答える 2

31

現時点では、Postgres に何を返してもらいたいかは不明です。順序付けする必要があると言いpersons.updated_atますが、データベースからそのフィールドを取得しません。

あなたがやりたいことは次のとおりだと思います:

SELECT date(updated_at), count(updated_at) as total_count 
FROM "persons"
WHERE ("persons"."updated_at" BETWEEN '2012-10-17 00:00:00.000000' AND '2012-11-07     12:25:04.082224') 
GROUP BY date(updated_at)
ORDER BY count(updated_at) DESC -- this line changed!

ここで、COUNT 集計の結果の値でソートするように DB に明示的に指示しています。を使用することもできます: ORDER BY 2 DESC、結果セットの 2 番目の列で並べ替えるようにデータベースに効果的に指示します。ただし、わかりやすくするために、列を明示的に記載することを強く好みます。

現在、このクエリをテストすることはできませんが、これは機能すると思います。

于 2012-11-07T12:57:59.047 に答える
6

問題は、 でグループ化しているためdate(updated_at)、 の値updated_atが一意ではない可能性があり、 の異なる値がupdated_atの同じ値を返す可能性があることですdate(updated_at)。データベース、使用可能な値のどれを使用するかを指示するか、代わりに group by によって返された値を使用する必要があります。

SELECT date(updated_at) FROM persons GROUP BY date(updated_at)
ORDER BY date(updated_at)

また

SELECT date(updated_at) FROM persons GROUP BY date(updated_at)
ORDER BY min(updated_at)
于 2012-11-07T13:09:21.450 に答える