gpt4 book ai didi

sql - 如何执行 SQL 游标转换

转载 作者:行者123 更新时间:2023-12-02 08:00:33 24 4
gpt4 key购买 nike

在我的 Oracle 存储过程中,有一个基于选择的查询,不是那么复杂,只是一些带有附加普通过滤器和单一排序依据的连接表。

查询包含一个用户(按名称排序),每个用户具有一些属性和可能的​​几行。

但是我需要添加一些计算的额外列。

  1. 将 1 设置为具有相同“name”的组中第一行的“flags”列(其他行为 0)。

  2. 确实加入同一字段“权利”的前一行值和其他列和当前行值(在我的例子中为“组”)的累积列“权利”,也应该为每个用户重新设置

例如:

john;        admin;         1;            admin
john; poweruser; 0; admin | poweruser
ken; guest; 1; guest
ted; developer; 1; developer
ted; user; 0; developer | user
ted; techwriter; 0; developer | user | techwriter

我需要执行一些格式化并作为存储过程的结果返回。不确定如何设置所需的值并从存储过程中返回它。

我是否应该将初始查询声明为游标、循环遍历并设置(完全可能?对于非数据库字段?)以及如何从存储过程返回此游标?

最佳答案

您还可以将其他一些分析函数与 LISTAGG() 一起使用来实现这一目的。由于您不提供测试数据,我将使用 EMP 表进行演示:

select deptno, ename,
case rn when 1 then 1 else 0 end flags,
case cnt when rn
then enames
else substr(enames, 1, instr(enames, ' | ', 1, rn) - 1)
end enames
from (
select deptno, ename,
row_number() over(partition by deptno order by ename) rn,
count(*) over(partition by deptno) cnt,
listagg(ename, ' | ') within group(order by ename) over(partition by deptno) enames
from emp
) a;

DEPTNO ENAME FLAGS ENAMES
10 CLARK 1 CLARK
10 KING 0 CLARK | KING
10 MILLER 0 CLARK | KING | MILLER
20 ADAMS 1 ADAMS
20 FORD 0 ADAMS | FORD
20 JONES 0 ADAMS | FORD | JONES
20 SCOTT 0 ADAMS | FORD | JONES | SCOTT
20 SMITH 0 ADAMS | FORD | JONES | SCOTT | SMITH
30 ALLEN 1 ALLEN
30 BLAKE 0 ALLEN | BLAKE
30 JAMES 0 ALLEN | BLAKE | JAMES
30 MARTIN 0 ALLEN | BLAKE | JAMES | MARTIN
30 TURNER 0 ALLEN | BLAKE | JAMES | MARTIN | TURNER
30 WARD 0 ALLEN | BLAKE | JAMES | MARTIN | TURNER | WARD

最好的问候,Stew Ashton

关于sql - 如何执行 SQL 游标转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58065030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com