[Oracle]拼接路径——LISTAGG和KEEP的用法

news/2024/12/15 7:51:53/

需求:

将以下路径明细

ROUTE_IDORIGINTARGETORDER
1AB1
1BC2
1CD3
2AB1
2BE2

拼接成

ROUTE_IDROUTE
1A->B->C->D
2A->B->E

效果
 

分析:

每条路径明细中包含了起点和终点,我们拼接时只需要取每次的起点使用->连接在一起,再加上最后一行的终点即可。

实现:

1.使用LISTAGG拼接 ORIGIN 列
WITH ROUTE_DATA AS(SELECT 1 AS ROUTE_ID, 'A' AS ORIGIN, 'B' AS TARGET, 1 AS SEQFROM DUALUNION ALLSELECT 1, 'B', 'C', 2FROM DUALUNION ALLSELECT 1, 'C', 'D', 3FROM DUALUNION ALLSELECT 2, 'A', 'B', 1FROM DUALUNION ALLSELECT 2, 'B', 'E', 2FROM DUAL)
SELECT ROUTE_ID,LISTAGG(ORIGIN, '->') WITHIN GROUP(ORDER BY SEQ) AS ROUTEFROM ROUTE_DATAGROUP BY ROUTE_ID;

得到结果:

   ROUTE_IDROUTE
11A->B->C
22A->B

2.使用KEEP,获取最后一行数据的 TARGET列并进行拼接
WITH ROUTE_DATA AS(SELECT 1 AS ROUTE_ID, 'A' AS ORIGIN, 'B' AS TARGET, 1 AS SEQFROM DUALUNION ALLSELECT 1, 'B', 'C', 2FROM DUALUNION ALLSELECT 1, 'C', 'D', 3FROM DUALUNION ALLSELECT 2, 'A', 'B', 1FROM DUALUNION ALLSELECT 2, 'B', 'E', 2FROM DUAL)
SELECT ROUTE_ID,LISTAGG(ORIGIN, '->') WITHIN GROUP(ORDER BY SEQ) || '->' || MIN(TARGET) KEEP(DENSE_RANK LAST ORDER BY SEQ) AS ROUTEFROM ROUTE_DATAGROUP BY ROUTE_ID;

 得到结果:

   ROUTE_IDROUTE
11A->B->C->D
22A->B->E

现在已经达到了我们的效果。

附录:

1.LISTAGG的用法:

LISTAGG 是 Oracle 数据库中用于将多行数据合并为单个字符串的聚合函数。它通常用于将查询结果中的多个值连接成一个逗号分隔的字符串或其他分隔符。

下面是 LISTAGG 函数的基本用法:

LISTAGG(column_name, delimiter) WITHIN GROUP (ORDER BY order_column) AS aggregated_column
  • column_name:要合并的列名。
  • delimiter:用于分隔合并后的值的分隔符,可以是字符串或表达式。
  • order_column:可选项,指定排序的列名,以确保合并后的字符串顺序正确。
  • aggregated_column:合并后的结果将放在此列中。

以下是一个示例,假设有一个名为 employees 的表,其中包含 employee_id 和 employee_name 列,你可以使用 LISTAGG 将员工


http://www.ppmy.cn/news/1555242.html

相关文章

libevent编译(cmake)及测试

前言 一个跨平台网络库 只所以写个,为了以后忘了,这里作为备份吧,都搭好多次了,换个机子搭一次 1:环境 分别在 ubuntu22 与 win10上编译下 libevent(2.1.12) download:https://libevent.org/ openssl(3.4.0) https://…

分支限界笔记

文章目录 概要整体架构流程基本概念分支限界法的定义核心思想 简单问题介绍问题:简单背包问题思考:暴力解法聪明的解法:分支限界法直观理解分支限界法的步骤0-1背包问题问题描述问题建模问题分析1. 定义问题的解空间,确定易于搜索…

实现盘盈单自动化处理:吉客云与金蝶云星空数据对接

盘盈单103v2对接其他入库:吉客云数据集成到金蝶云星空 在企业信息化管理中,数据的高效流转和准确性至关重要。本文将分享一个实际案例,展示如何通过轻易云数据集成平台,将吉客云的数据无缝对接到金蝶云星空,实现盘盈单…

LeetCode300. 最长递增子序列(2024冬季每日一题 30)

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的 子序列。 示例 1&…

【汇编】思考汇编中的两个基本问题

1. 若干年前的疑问 几年前还在大学学习汇编时,不管是考试还是课程设计,其实都很顺利。但是心里一直对什么时候使用哪个寄存器存在疑惑,编写汇编时,没有十足的把握,都是抱着试一试的心态去完成了课程任务。 工作八年有…

ThinkPHP开发的原生微信小程序二手物品回收小程序管理系统源码

二手物品回收小程序 一款基于ThinkPHP开发的原生微信小程序二手物品回收小程序管理系统。支持线上下单、免费上门取件、评估价格等功能。提供全部无加密源码,支持私有化部署。

专题一:斐波那契数列模型算法

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是记忆化搜索,并且掌握记忆化搜索算法。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早…

vue中打包dist文件内assets 和 static 的区别

背景 在Vue.js项目中,assets 和 static 是两个用于存放静态资源的文件夹,但它们在使用方式和处理机制上有所不同 用途 assets: assets 文件夹通常用于存放那些需要在构建过程中被Webpack处理的静态资源。这些资源可以包括图片、字体、样式文件&#…