0

次のような非常に標準的なアーカイブ情報を含むブログのサイドバーを作成しようとしています:

2013 年 8 月: 3 件の投稿

2013 年 7 月: 5 件の投稿

2013 年 6 月: 4 件の投稿

...等

monthこの情報 ( 、yearcount) を逆時系列でソートした ActiveRecord クエリはどれですか?

Post モデルは非常に単純です -- title, body, created_at,modified_at列。上記のように、月と年でグループ化された投稿の数を取得する ActiveRecord/Postgres クエリを作成しようとしています。次のクエリは、まさにそれを正常に実行します。

Post.select('count(*) as count','extract(year from created_at) as year', 'extract(month from created_at) as month').group('year','month')

しかし、私は明示的に列を時系列で逆にソートしたいと考えています (したがって、2013 年 8 月はリストで 2013 年 7 月よりも上になります)。始めるために、次のクエリを試してみましたが失敗しました。

Post.select('count(*) as count','extract(year from created_at) as year', 'extract(month from created_at) as month').group('year','month').order(:year => :desc)

次の SQL が生成されます。

SELECT count(*) as count, extract(year from created_at) as year, extract(month from created_at) as month FROM "posts" GROUP BY year, month ORDER BY "posts"."year" DESC

そして、次のエラー:

PG::UndefinedColumn: ERROR: column posts.year does not exist

を使用してカウントで並べ替えると、クエリは実際に実行されます.order(:count => :desc)が、実際には期待どおりに並べ替えられていないようです (に切り替えて:ascも違いはありません)。

私はSOとグーグルを精査しましたが、役に立ちませんでした。並べ替えも試しましたcreated_atが、エラーがスローされActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "posts.created_at" must appear in the GROUP BY clause or be used in an aggregate functionます。理想的には、単純なPost.order(:created_at => :desc)を実行し、適切に並べられた結果に対してグループ化クエリを実行しますが、方法がわかりません。

year非常に失われました...列と列monthを使用して投稿を取得するにはどうすればよいcountですか?結果のグループを時系列で逆順に並べますか?

ご協力いただきありがとうございます。

4

1 に答える 1

1

GROUPすべてのデータベースで、 orORDER句で派生列名を参照できるわけではありません。私自身 PostgreSQL については知りませんが、おそらく相対列参照をサポートしていると思われます。これを試して:

SELECT count(*) as count
     , extract(year from created_at) as year
     , extract(month from created_at) as month 
FROM "posts" 
GROUP BY 2, 3 
ORDER BY 2 DESC, 3 DESC

それでもうまくいかない場合は、次のようにする必要があります。

SELECT count(*) as count
     , extract(year from created_at) as year
     , extract(month from created_at) as month 
FROM "posts" 
GROUP BY extract(year from created_at), extract(month from created_at)
ORDER BY extract(year from created_at) DESC, extract(month from created_at) DESC
于 2013-09-02T00:51:45.317 に答える