2011-09-11 51 views
3

下面是查詢:PostgreSQL的查詢本地而不是工作在Heroku(相同的數據)

的ActiveRecord :: StatementInvalid(PGError:錯誤:在語法錯誤或接近 「過」 SELECT *,秩()以上(分區通過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 

編輯:這裏是什麼,我試圖做一個詳細的解釋: 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'可能會爲單個線程產生多個結果。您可能需要包含一個客戶端檢查來處理重複的'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 

編輯 - 按評論:德里克和葉海亞

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

看到上面的編輯...它通過只返回具有最高OID(假設它是最新的...)的記錄來處理可能的重複問題,對於'thread_id'和'created_at'的給定組合 – Yahia

+1

尼斯,舊的'oid'技巧。我會給你另一個upvote,但我只有一個帳戶:)遺憾的是,Heroku沒有更新他們的共享DB到8.4來獲得窗口函數。關於比賽的難得機會,我認爲你選擇哪一個並不重要,你只需要一種方法來選擇一個。 –

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中處理這種可能性。 –

相關問題