postgresql - 使用辅助字段排序,开始和结束
问题描述
在 PostgreSQL 中,以通用方式使用开始和结束字段对记录进行排序的最佳方法是什么,而不需要在查询中包含第一条记录 ( where start_id=3
)?
示例表:
+-------+----------+--------+--------+
| FK_ID | START_ID | END_ID | STRING |
+-------+----------+--------+--------+
| 77 | 1 | 9 | E |
| 82 | 5 | 2 | A |
| 77 | 7 | 1 | I |
| 77 | 3 | 7 | W |
| 82 | 9 | 5 | Q |
| 77 | 9 | 5 | X |
| 82 | 2 | 7 | G |
+-------+----------+--------+--------+
排序where FK_ID = 77
:
+----+---+---+---+
| 77 | 3 | 7 | W |
| 77 | 7 | 1 | I |
| 77 | 1 | 9 | E |
| 77 | 9 | 5 | X |
+----+---+---+---+
排序where FK_ID = 82
:
+----+---+---+---+
| 82 | 9 | 5 | Q |
| 82 | 5 | 2 | A |
| 82 | 2 | 7 | G |
+----+---+---+---+
结果查询顺序:
+-------+----------+
| FK_ID | SEQUENCE |
+-------+----------+
| 82 | QAG |
| 77 | WIEX |
+-------+----------+
解决方案
我认为这不是最有效的方法,但您可以尝试使用递归 CTE
WITH RECURSIVE path AS (
SELECT * FROM myTable AS t1 WHERE NOT EXISTS(
SELECT 1 FROM myTable AS t2 WHERE t1.fk_id = t2.fk_id AND t2.end_id = t1.start_id
) ORDER BY start_id LIMIT 1
UNION ALL
SELECT myTable.* FROM myTable JOIN path ON path.end_id = myTable.start_id
)
SELECT fk_id,array_to_string(array_agg(string)) FROM path GROUP BY fk_id
推荐阅读
- reactjs - 尝试设置图像大小但在 setState 上出现错误
- flutter - 导航到新页面时 BLOC 丢失上下文
- python - 在Python中,如何根据一列中的值比较两个csv文件并从第一个文件中输出与第二个不匹配的记录
- python - 在 Markdown 中创建链接的主题标签
- javascript - 更新 vue-chartjs yaxis 最大值而不重新渲染整个 vue 图表 js
- c++ - C++ unordered_map 初始化读取访问冲突
- laravel - 登录失败过多后如何在laravel中将lockoutTime时间从秒增加到分钟?
- vuetify.js - 路由器中断了 vuetify 选项卡
- java - 在android java上连接到服务器的websocket
- python - 使用 GCN 的预测不好但模型准确度高