假设我有用户A
和B
,他们会在数据库中创建一些项目。当按创建日期排序时,它们看起来像这样:
items = A, A, A, B, B, A, B, B
也就是说,A
创建3个项目,然后B
创建2,然后A
创建1,最后B
再创建2个。
我想计算连续重复用户ID的数量,而保留订购,这就是我想要的结果:
repeats = [{A: 3}, {B: 2}, {A: 1}, {B: 2}]
如何使用ActiveRecord查询进行此类计数?我的数据库是Postgres。
我尝试了group(:user_id)
和count(:user_id)
的组合,但在使用order(created_at: :desc)
答案 0 :(得分:2)
这样做的一种方法是使用行号方法的区别:
select t, count(*) as cnt
from (select t.*,
row_number() over (order by creationdate) as seqnum,
row_number() over (partition by user order by creationdate) as seqnum_u
from t
) t
group by user, (seqnum - seqnum_u);
答案 1 :(得分:0)
我已经决定在这种情况下基于SQL的纯解决方案过于复杂。一旦你考虑了一些额外的查询条件,整个事情将变得难以理解和维护。因此,我决定在应用程序逻辑中实现计数。
以下是我如何实施它的示例。这很简单。
/* post api to add song in playlist */
router.post('/addSongToPlaylist', function (req, res, next) {
Playlist.findOne({ '_id': req.body.playlistId }, function (err, playlist) {
if (err) return next(err);
console.log(playlist)
console.log("req.body.songId", req.body.songId);
if (playlist) {
Playlist.findByIdAndUpdate(
req.body.playlistId,
{ $push: { "songId": req.body.songId } },
{ new: true },
function (err, playlistData) {
if (err) return next(err);
res.json({ message: 'New Song added successfully', playlist: playlistData, success: true });
});
} else if (!Song) {
res.json({ message: 'Failed to add song', success: false });
}
});
});
注意:用于演示逻辑的简化代码可能实际上不会运行。