鉴于以下型号:如何查询基于组和记录的记录?
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