sql – 通过重复属性进行分组
基本上我有一个表消息,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个消息组: 它应该按* user_id *分组,直到它看到另一个,然后按那个分组. 我正在使用PostgreSQL,并乐于使用特定的东西,无论什么能带来最佳性能. 解决方法适当的SQL@Igor提供了一个很好的带有窗口函数的纯SQL技术.
要获取请求的订单,请添加ORDER BY min(id): SELECT array_agg(id) AS ids FROM ( SELECT id,user_id,row_number() OVER (ORDER BY id) - row_number() OVER (PARTITION BY user_id ORDER BY id) AS grp FROM messages ORDER BY id) t -- for ordered arrays in result GROUP BY grp,user_id ORDER BY min(id); SQL Fiddle. 这一补充几乎无法得到另一个答案.更重要的问题是: 使用PL / pgSQL更快
纯SQL既漂亮又闪亮,但程序服务器端功能对于此任务来说要快得多.虽然在程序上处理行通常较慢,但plpgsql赢得此竞争的重要时间,因为它可以使用单个表扫描和单个ORDER BY操作: CREATE OR REPLACE FUNCTION f_msg_groups() RETURNS TABLE (ids int[]) AS $func$ DECLARE _id int; _uid int; _id0 int; -- id of last row _uid0 int; -- user_id of last row BEGIN FOR _id,_uid IN SELECT id,user_id FROM messages ORDER BY id LOOP IF _uid <> _uid0 THEN RETURN QUERY VALUES (ids); -- output row (never happens after 1 row) ids := ARRAY[_id]; -- start new array ELSE ids := ids || _id; -- add to array END IF; _id0 := _id; _uid0 := _uid; -- remember last row END LOOP; RETURN QUERY VALUES (ids); -- output last iteration END $func$LANGUAGE plpgsql; 呼叫: SELECT * FROM f_msg_groups(); 基准和链接 我在一个类似60k行的真实生活表上运行了EXPLAIN ANALYZE的快速测试(执行几次,选择最快结果以排除兑现效果): SQL: 还要考虑这些密切相关的问题: > GROUP BY and aggregate sequential numeric values 【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。 |
-
我从这里生成一个视图: create or replace view date...[详细]
-
sql – LEFT JOIN(OUTER JOIN)与INNER JOIN的条件
SELECT A.COL1,B.COL1,C.COL1FROM TABLEA ALEFT JOIN ...[详细]
-
本篇章节讲解CI框架(CodeIgniter)公共模型类定义与用...[详细]
-
解决form中action属性后面?传递参数 获取不到的问题
如下所示: echo " 您将更新商品编号为 $p_id 的商品...[详细]
-
sql – Oracle是否为Number数据类型存储尾随零?
当我在表中存储数值并在SQL Developer中查询该表时,它...[详细]
-
本篇章节讲解php基于SQLite实现的分页功能。供大家参...[详细]
-
本篇章节讲解PHP封装的PDO数据库操作类。分享给大家供...[详细]
-
这里要说明一下 因为本人比较懒 博客中相关文章的内容...[详细]
-
今天PHP站长网 52php.cn把收集自互联网的代码分享给大...[详细]
-
本篇章节讲解PHP实现删除多重数组对象属性并重新赋值...[详细]