Vla*_*ich 1 sql postgresql ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)
我希望按以下顺序获得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;
Run Code Online (Sandbox Code Playgroud)
表达方式:
row_number() OVER (ORDER BY created_at)-
row_number() OVER (PARTITION BY user_id ORDER BY created_at) conv_id
Run Code Online (Sandbox Code Playgroud)
将为每个消息组提供一个特殊的id(这conv_id可以为其他消息组重复user_id,但user_id, conv_id会为您提供所有不同的消息组)
我的SQLFiddle与示例.
细节:row_number(),OVER (PARTITION BY ... ORDER BY ...)
| 归档时间: |
|
| 查看次数: |
1876 次 |
| 最近记录: |