sql - 按重复属性分组

标签 sql ruby-on-rails postgresql plpgsql window-functions

基本上我有一个表 messages,其中包含 user_id 字段,用于标识创建消息的用户。

当我显示两个用户之间的对话(消息集)时,我希望能够按 user_id 对消息进行分组,但采用一种棘手的方式:

假设有一些消息(按 created_at desc 排序):

  id: 1, user_id: 1
  id: 2, user_id: 1
  id: 3, user_id: 2
  id: 4, user_id: 2
  id: 5, user_id: 1

我想按以下顺序获取 3 个消息组: [1,2], [3,4], [5]

它应该按 *user_id* 分组,直到它看到一个不同的,然后按那个分组。

我正在使用 PostgreSQL,并且很乐意使用特定于它的东西,无论什么都能提供最佳性能。

最佳答案

尝试这样的事情:

SELECT user_id, array_agg(id)
FROM (
SELECT id, 
       user_id, 
       row_number() OVER (ORDER BY created_at)-
       row_number() OVER (PARTITION BY user_id ORDER BY created_at) conv_id
FROM table1 ) t
GROUP BY user_id, conv_id;

表达式:

row_number() OVER (ORDER BY created_at)-
row_number() OVER (PARTITION BY user_id ORDER BY created_at) conv_id

会给每个消息组一个特殊的id你们所有不同的消息组)

我的 SQLFiddle举例说明。

详情:row_number() , OVER (PARTITION BY ... ORDER BY ...)

关于sql - 按重复属性分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14010348/

相关文章:

ruby-on-rails - 将 Rails 5 部署到 Linux 服务器

ruby-on-rails - 在 Ruby on Rails 中,如何将 Controller 中的所有操作映射到 root?

ruby-on-rails - 如果选择存在,不要创建嵌套表单

sql - PostgreSQL 对 string\varchar 的各种清理

sql - 在 SQL 中计算和划分来自多个列的不同值对

sql - 为什么此查询不使用索引?

mysql - 我无法更新具有两个唯一键的表

sql - 如何使用事件记录计算 has_many 关系?

sql - 使用单个 SQL 命令更新表并显示更新的行

performance - 为什么有很多用户生成的表不是一个好主意