鑑於以下型號:如何查詢基於組和記錄的記錄?
User
id
UserPulses
id, user_id, group_id, created_at
我想要做的是獲得所有用戶的UserPulses由(GROUP_ID)分組的,只有獲得每GROUP_ID最近UserPulse。我已經能夠通過逐組循環來做到這一點,但這需要大量的查詢。這是可能的一個查詢?
喜歡的東西: user.user_pulses.group( 「GROUP_ID)」)
任何想法?謝謝
鑑於以下型號:如何查詢基於組和記錄的記錄?
User
id
UserPulses
id, user_id, group_id, created_at
我想要做的是獲得所有用戶的UserPulses由(GROUP_ID)分組的,只有獲得每GROUP_ID最近UserPulse。我已經能夠通過逐組循環來做到這一點,但這需要大量的查詢。這是可能的一個查詢?
喜歡的東西: user.user_pulses.group( 「GROUP_ID)」)
任何想法?謝謝
也許是這樣的。但是,如果用戶/ group_id組合共享相同的日期,則可能有多個記錄。
SELECT p.id, p.user_id, p.group_id, p.created_at
FROM UserPulses p
,(SELECT user_id, group_id, MAX(created_at) as max_date
FROM UserPulses
GROUP BY user_id, group_id) m
WHERE u.user_id = m.user_id
AND u.group_id = m.group_id
AND u.created_at = m.max_date
無法通過正常的ActiveRecord接口做到這一點可靠的,但你可以使用window function做到這一點通過SQL。你想一些這樣的SQL:
select id, user_id, group_id, created_at
from (
select id, user_id, group_id, created_at,
row_number() over (partition by group_id order by created_at desc, id desc) as r
from user_pulses
where user_id = :user_id
) dt
where r = 1
,然後包裹在find_by_sql
:
pulses = UserPulses.find_by_sql([%q{
select id, user_id, group_id, created_at
from (
select id, user_id, group_id, created_at,
row_number() over (partition by group_id order by created_at desc, id desc) as r
from user_pulses
where user_id = :user_id
) dt
where r = 1
}, :user_id => user.id])
窗口函數部分本質上是做本地GROUP BY與每個group_id
,對它們進行分類(與id desc
爲二級排序鍵作爲「萬一」聯繫斷路器),並在r
中顯示每個組的行號。然後,外部查詢篩選出每個組中的第一個(where r = 1
)and peels off the original
user_pulses`列。
謝謝,試着通過它進行調試。獲取錯誤「PG :: Error:ERROR:語法錯誤處於或接近」:「 LINE 7:其中user_id =:user_id 」 – AnApprentice
這似乎是返回一個數組,意味着我無法執行pulses.where(:group_id => 1)從無數據庫的數組中獲取記錄。有沒有辦法從這個數組中提取一個項目? – AnApprentice
@AnApprentice:'find_by_sql'希望您在使用佔位符時將參數包裝在數組中。我只是添加了缺少的['和']'。對於那個很抱歉。 –
可以使用SQL功能DISTINCT
的PostgreSQL的特定擴展名:DISTINCT ON
SELECT DISTINCT ON (group_id)
id, user_id, group_id, created_at
FROM user_pulses
WHERE user_id = :user_id
ORDER BY group_id, created_at DESC, id; -- id just to break ties
簡單得多窗口功能(但不作爲便攜式),可能最快。
更多details under this related question。
在每個用戶/ group_id每天會有多個mos記錄。建議? – AnApprentice