2011-09-11 4 views
3

ここでは、クエリです:クエリはHerokuの上でローカルに動作しますが、ないのPostgreSQL(同じデータ)

はActiveRecord :: StatementInvalid(PGError:ERROR: "オーバー" 構文でエラーまたは近くには、(*、ランクを選択)(パーティションオーバーthread_iで... ^

 SELECT * 
    FROM (                 
      select *, rank() over (partition by thread_id order by created_at DESC) 
      from posts 
      where circle_id IN (134) OR (receiver_id=3) 
      ) as dt 
    WHERE rank = 1 

EDITは: Rails 3 app with PostgreSQL - Getting the list of messages grouped by converstation

結局のところHerokuのは、共有DBがPostgrである:ここで私が何をしようとしています何の詳細な説明はありますeSQLバージョン8.3したがって、Windows機能はありませんので、PostgreSQL 8.3でこのクエリを実行するにはどうすればいいですか?

感謝!

+0

デレクとヤヒアから派生テーブルソリューションは8.3で動作するはずです。 'posts.created_at = dt.maxdt'が1つのスレッドに対して複数の結果を生成する可能性があります。重複した 'thread_id、created_at'のペアを処理するクライアント側のチェックを含めることができます。重複の可能性はかなり低いですが、「低」と「ゼロ」は全く同じではありません。 –

+1

は、重複した問題の可能な解決策で私の答えを更新しました... – Yahia

答えて

2

SELECT p.* 
FROM (                 
     select x.thread_id, max(x.created_at) as maxdt 
     from posts x 
     where x.circle_id IN (134) OR x.receiver_id=3 
     group by x.thread_id 
     ) as dt 
INNER JOIN posts p ON p.thread_id = dt.thread_id and p.created_at = dt.maxdt 
ORDER BY p.created_at DESC 

EDITを試してみてください - コメントどおり:

SELECT p.* 
FROM (                 
     select x.thread_id, max(x.created_at) as maxdt, max (OID) maxo 
     from posts x 
     where x.circle_id IN (134) OR x.receiver_id=3 
     group by x.thread_id 
     ) as dt 
INNER JOIN posts p ON p.thread_id = dt.thread_id and p.created_at = dt.maxdt AND p.OID = dt.maxo 
ORDER BY p.created_at DESC 
+1

Matteoが同じ 'thread_id、created_at'ペアで複数のエントリを取得した場合、重複する可能性は非常に低いです。私はRubyでもその可能性を扱っています。 –

+0

上記の編集を参照してください... 'thread_id'と' created_at'の指定された組み合わせに対して最も高いOIDを持つレコードを返すだけで、重複する可能性のある問題を処理します。 – Yahia

+1

ニース、古い 'oid'トリックです。私はあなたのために別のupvoteを与えるだろうが、私は1つのアカウントがあります:) Herokuは8.4にウィンドウ関数を取得する共有DBを更新していない恥ずかしい。私はあなたが選ぶものが重要だとは思わないが、まったく正しいものを選ぶ方法が必要です。 –

1

これはそこにあなたを取得する必要があります。

SELECT p.* 
FROM (                 
     select thread_id, max(created_at) as maxdt 
     from posts 
     where circle_id IN (134) OR (receiver_id=3) 
     ) as dt 
INNER JOIN posts p ON p.thread_id = dt.thread_id and p.created_at = dt.maxdt 
+0

Matteoが同じ 'thread_id、created_at'ペアで複数のエントリを取得した場合、重複する可能性は非常に低いです。私はRubyでもその可能性を扱っています。 –

関連する問題