2015-04-01 52 views
1

我一直負責將Rails應用程序從MySQL轉換爲Postgres,並遇到小問題。
活動記錄查詢:DISTINCT ON查詢w/ORDER BY列的最大值

current_user.profile_visits.limit(6).order("created_at DESC").where("created_at > ? AND visitor_id <> ?", 2.months.ago, current_user.id).distinct

主要生產的SQL:

SELECT visitor_id, MAX(created_at) as created_at, distinct on (visitor_id) * 
FROM "profile_visits" 
WHERE "profile_visits"."social_user_id" = 21 
AND (created_at > '2015-02-01 17:17:01.826897' AND visitor_id <> 21) 
ORDER BY created_at DESC, id DESC 
LIMIT 6 

使用MySQL時,我非常有信心,但我誠實新的Postgres。我認爲這個查詢失敗的原因有很多。

  1. 我認爲需要首先區分。
  2. 我不知道如何按最大功能的結果排序
  3. 我可以使用像這樣的最大功能嗎?

此查詢的高級別目標是返回用戶的最近6個配置文件視圖。任何指針如何解決這個ActiveRecord查詢(或它的結果SQL)將不勝感激。

+0

有問題的查詢將不會使用MySQL。 'distinct on'是一個Postgres構造,所以我假設整個事物都是Postgres兼容的。但是,使用'max()'是非常可疑的。 – 2015-04-01 16:38:51

+0

一如既往,您的Postgres版本和表格定義應該在問題中。此外,查詢應該做什麼的描述可能不完整。 – 2015-04-02 20:44:41

回答

0

此查詢的高層次目標是返回6最近 個人資料被訪問用戶的

這會很簡單。你並不需要爲這個max()也不DISTINCT

SELECT * 
FROM profile_visits 
WHERE social_user_id = 21 
AND created_at > (now() - interval '2 months') 
AND visitor_id <> 21 -- ?? 
ORDER BY created_at DESC NULLS LAST, id DESC NULLS LAST 
LIMIT 6; 

我懷疑你的問題是不完整的。如果你想:
與頁面
他們的最新訪問了6個最新訪客,那麼你需要一個子查詢。你不能在一個查詢級別得到這個排序順序,也沒有用DISTINCT ON,也不能與窗口函數:

SELECT * 
FROM (
    SELECT DISTINCT ON (visitor_id) * 
    FROM profile_visits 
    WHERE social_user_id = 21 
    AND created_at > (now() - interval '2 months') 
    AND visitor_id <> 21 -- ?? 
    ORDER BY visitor_id, created_at DESC NULLS LAST, id DESC NULLS LAST 
    ) sub 
ORDER BY created_at DESC NULLS LAST, id DESC NULLS LAST 
LIMIT 6; 

子查詢sub獲取每個用戶的最新訪問(但年齡不超過兩個月,沒有一定訪客21ORDER BY必須具有相同的前導列作爲DISTINCT ON

您需要外部查詢,以獲得最新的6名參觀者然後
考慮事件的順序:。

爲什麼NULLS LAST?可以肯定的是,你沒有提供表格定義。