如果我有这样的数据:
GROUP | SEQUENCE | COMMAND
------------------------------
ONE | 3 | <message2>MESSAGE</message2>
ONE | 1 | <?xml version="1.0" encoding="UTF-8"?>
ONE | 2 | <message1>MESSAGE</message1>
TWO | 2 | <message2>MESSAGE</message2>
TWO | 1 | <?xml version="1.0" encoding="UTF-8"?>
........
TWO | 10 | <message9>MESSAGE</message9>
我如何将命令连接成这样:
GROUP | COMMAND
-----------------
ONE | <?xml version="1.0" encoding="UTF-8"?>,<message1>MESSAGE</message1>,<message2>MESSAGE</message2>
TWO | <?xml version="1.0" encoding="UTF-8"?>,<message1>MESSAGE</message1>, .. ,<message9>MESSAGE</message9>
我在下面使用了此查询,但命令列的顺序不依其顺序号而定:
SELECT GROUP, WM_CONCAT(COMMAND) AS COMMAND
FROM (SELECT GROUP, SEQUENCE, COMMAND FROM TBL ORDER BY SEQUENCE)
GROUP BY GROUP
//AND THIS
SELECT GROUP, WM_CONCAT(DISTINCT COMMAND) AS COMMAND
FROM (SELECT GROUP, SEQUENCE, COMMAND FROM TBL ORDER BY SEQUENCE)
GROUP BY GROUP
任何意见和建议将不胜感激。^ _ ^
永远不要使用WM_CONCAT
。阅读为什么不在Oracle中使用WM_CONCAT函数?
请参阅本主题https://stackoverflow.com/a/28758117/3989608。
它没有记录,并且依赖的任何应用程序WM_CONCAT
一旦升级到后都将无法工作,12c
因为它已从最新的12c版本中删除。
根据 数据库版本* ,有很多方法可以进行 字符串聚合 。请参阅以下几个示例: *
11gR2
用途LIASTAGG
:
SQL> SELECT grp,
2 listagg(command, ',') WITHIN GROUP(
3 ORDER BY seq) command
4 FROM t
5 GROUP BY grp;
GRP COMMAND
--- --------------------------------------------------------------------------------------------
ONE <?xml version=1.0 encoding=UTF-8?>,<message1>MESSAGE</message1>,<message2>MESSAGE</message2>
TWO <?xml version=1.0 encoding=UTF-8?>,<message2>MESSAGE</message2>,<message9>MESSAGE</message9>
SQL>
9i及以上
使用ROW_NUMBER()
和SYS_CONNECT_BY_PATH
:
SQL> SELECT grp,
2 LTRIM(MAX(SYS_CONNECT_BY_PATH(command,','))
3 KEEP (DENSE_RANK LAST ORDER BY seq),',') command
4 FROM (SELECT grp,
5 command,
6 seq,
7 ROW_NUMBER() OVER (PARTITION BY grp ORDER BY seq) AS curr,
8 ROW_NUMBER() OVER (PARTITION BY grp ORDER BY seq) -1 AS prev
9 FROM t)
10 GROUP BY grp
11 CONNECT BY prev = PRIOR curr AND grp = PRIOR grp
12 START WITH curr = 1;
GRP COMMAND
--- --------------------------------------------------------------------------------------------
ONE <?xml version=1.0 encoding=UTF-8?>,<message1>MESSAGE</message1>,<message2>MESSAGE</message2>
TWO <?xml version=1.0 encoding=UTF-8?>,<message2>MESSAGE</message2>,<message9>MESSAGE</message9>
SQL>
问题内容: 我有一个包含5个整数ID的表,并想添加一列以接受这些ID,对其进行排序并以类似于以下内容的方式将它们连接起来。 是否有使订购更快更轻松的功能?上帝禁止我必须手动编写订单。 问题答案: 您也可以使用(在线演示)
这就是我试图解决但不确定如何解决的问题:我有一个对象数组(假设大小为100),每个对象都有一些id。 有10个线程将从该数组中读取数据并将其插入数据库。 如何确保数据以递增序列的方式根据员工ID的序列插入数据库。例如: 如果数组中的对象具有员工ID 6、8和4,那么这些对象应该按照员工ID 4、6和8在数据库中的顺序插入数据库。如何为此编写多线程代码? 更新:请忽略数据库部分,如果它令人困惑,我的
在我的示例项目中,我尝试在应用程序启动时做一些初始化工作。 Java 16 Vertx 4.1.0 检查完整的项目代码。 但它并没有像预期的那样工作。 没有像Reactor那样的方法 我找不到一种有效的方法来按顺序执行它们。 更新时间: 我按照建议更改了代码。 并在控制台中获取以下日志。 如何在输入打印结果之前确保插入块中的所有未来都已完成。
我有一个如下的模型: 它填充了一些数据: 我需要合并/加入一个集合(不是queryset): 所以基本上,当我用这个元组列表搜索这个模型时,第0行和第2行应该返回。 目前,我的解决方法是将 读取到数据帧中,并与元组列表进行合并,并将 ID 传递给 。我还尝试迭代列表并在每个元组上调用 但它非常慢。这个清单相当大。 当我尝试按照当前答案的建议链接Q时,它抛出了一个OperationalError(太
问题内容: 我有如下代码: 效果很好,但似乎是以相反的字母顺序列出文件。有没有一种快速的方法可以告诉您按字母顺序列出文件? 问题答案: 带有或不带有过滤器的方法不能保证任何顺序。 但是,它确实返回一个数组,您可以使用对其进行排序。 这是可行的,因为是一个可比较的类,默认情况下按字典顺序对路径名进行排序。如果要对它们进行不同的排序,则可以定义自己的比较器。 如果您更喜欢使用流: 下面是一种更现代的方
问题内容: 我有下表称为问题: 我只想选择每个询问者一次,如果有多个同名提问者,请选择ID最高的一个。因此,预期结果: 我使用以下查询: 我得到以下结果: 因此,它将选择遇到的第一个“鲍勃”,而不是最后一个。 谢谢 问题答案: 如果要为每一个添加最后一个,则应使用聚合函数: 之所以得到不寻常的结果,是因为MySQL使用了一个扩展名,该扩展名允许未选择列表中的项进行汇总,并且不包含在GROUP BY