按日期对记录排序并计算重复用户的数量

时间:2017-08-04 03:08:47

标签: ruby-on-rails postgresql activerecord

假设我有用户AB,他们会在数据库中创建一些项目。当按创建日期排序时,它们看起来像这样:

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)

时也不起作用

2 个答案:

答案 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 });
    }

  });
});

注意:用于演示逻辑的简化代码可能实际上不会运行。