我有一个用例,其中有一个存储一些字符的列,flg列和类别列。基于flg,如果flg是1,则对于第i行,resl应该是第i行上方的行的字符(通过“+”连接)和第i行Columnl值的连接。“第i行以上”意味着SEQNCE<SEQNCE(i)。
如果flg为零,则res 1 = Column 1。如果类别发生变化(例如:Category=2 Column 1 ='I'是一个新的集合),它应该从该行开始连接的过程。
例如,下面是名为“dmy_tbl”的表
LISTAGG是一个这样的选项,用于连接其他列的字符串组& LAG是用于获取行上方的行的选项,我已经尝试了下面的查询,但它没有产生预期的结果。我也无法决定如何划分类别。对于这个用例的任何建议都是非常受欢迎的。
select column1,catg,flg,SEQNCE,
case when ((flg=1 and res is null) or flg=0) then column1
else column1||'+'||res end as result
from
(select column1,catg,flg,SEQNCE,
case when flg=1 then lag(column1)
over(order by catg,SEQNCE asc) else column1 end as res
FROM dmy_tbl
order by catg,SEQNCE asc);
内部查询res列只提取上面的一行,不确定如何在内部查询中放入LISTAGG以提取上面的所有行
3条答案
按热度按时间pkln4tw61#
可以使用
MODEL
子句:其中,对于样本数据:
输出:
| 指示器|序列|产品分类|RES1| RES1 |
| - -----|- -----|- -----|- -----| ------------ |
| 一个|一个|一个|一个| A |
| 0| 2|一个|B| B |
| 0|三个|一个|C类| C |
| 一个|4|一个|A+B+C+D| A+B+C+D |
| 一个|5个|一个|A+B+C+D+E| A+B+C+D+E |
| 一个|六|一个|A+B+C+D+E+F| A+B+C+D+E+F |
| 0|七个|一个|G级| G |
| 一个|八|一个|A+B+C+D+E+F+G+H| A+B+C+D+E+F+G+H |
| 一个|一个|2|我的| I |
| 0| 2| 2| J型| J |
| 一个|三个|2| I+J+K| I+J+K |
| 一个|4| 2| I+J+K+L| I+J+K+L |
fiddle
f87krz0w2#
如果您不关心是否涉及PL/SQL,那么一个简单的函数就可以完成这项工作。
测试:
zxlwwiss3#
在Oracle 12中,您可以使用
MATCH_RECOGNIZE
和LISTAGG
:其中,对于样本数据:
输出:
| 指示器|序列|产品分类|RES1| RES1 |
| - -----|- -----|- -----|- -----| ------------ |
| 一个|一个|一个|一个| A |
| 0| 2|一个|B| B |
| 0|三个|一个|C类| C |
| 一个|4|一个|A+B+C+D| A+B+C+D |
| 一个|5个|一个|A+B+C+D+E| A+B+C+D+E |
| 一个|六|一个|A+B+C+D+E+F| A+B+C+D+E+F |
| 0|七个|一个|G级| G |
| 一个|八|一个|A+B+C+D+E+F+G+H| A+B+C+D+E+F+G+H |
| 一个|一个|2|我的| I |
| 0| 2| 2| J型| J |
| 一个|三个|2| I+J+K| I+J+K |
| 一个|4| 2| I+J+K+L| I+J+K+L |
fiddle