sql - Oracle SQL (PL/SQL) 中带有集合的窗口函数(超前/滞后)

标签 sql oracle plsql window-functions

我想将 PostgreSQL 中存在的 SQL 脚本移植到 Oracle SQL。 这是示例数据:

NR                      GRD DT
00000000000000000001    06  01.01.13
00000000000000000001    06  01.01.13
00000000000000000001    21  01.01.13
00000000000000000002    06  01.01.13
00000000000000000002    21  01.01.13
00000000000000000004    01  31.03.13

这是我的简化代码:

CREATE TYPE tbl_array AS TABLE OF NVARCHAR2(4000);

with prep as (
Select
    nr
    , cast(collect(grd) as tbl_array) grds
from
    test_table
group by
    nr                    
)
select 
    prep.*
    , lead(grds) over (order by nr) as lead_grds
from 
    prep

但是窗口功能不起作用。我收到以下错误消息:

ORA-00932: inconsistent datatypes: expected - got ORACLEANALYTICS.TBL_ARRAY

是因为创建类型的原因吗?我该如何解决这个问题? 在第二步中,我想检查集合与其他集合的交集(已经工作),所以我需要它们。这有可能吗?

干杯 克里斯

最佳答案

您可以使用ROW_NUMBER()来模拟LAG/LEAD:

with prep as (
  select
    nr, CAST(collect(grd) AS tbl_array) grds,ROW_NUMBER() OVER(ORDER BY nr) AS rn
  from tab
  group by nr                    
)
select p.nr, p.grds, p2.grds AS lead_grds
    --, lead(grds) over (order by nr) as lead_grds
from prep p
LEFT JOIN prep p2
  ON p2.rn = p.rn +1;

准备工作的输出:

┌──────────────────────┬────────────────────────────────┬────┐
│          NR          │              GRDS              │ RN │
├──────────────────────┼────────────────────────────────┼────┤
│ 00000000000000000001 │ HR.TBL_ARRAY('06', '21', '06') │  1 │
│ 00000000000000000002 │ HR.TBL_ARRAY('06', '21')       │  2 │
│ 00000000000000000004 │ HR.TBL_ARRAY('01')             │  3 │
└──────────────────────┴────────────────────────────────┴────┘

整个查询的输出:

┌──────────────────────┬──────────────────────────────┬──────────────────────────┐
│          NR          │             GRDS             │        LEAD_GRDS         │
├──────────────────────┼──────────────────────────────┼──────────────────────────┤
│ 00000000000000000001 │HR.TBL_ARRAY('06', '21', '06')│ HR.TBL_ARRAY('06', '21') │
│ 00000000000000000002 │HR.TBL_ARRAY('06', '21')      │ HR.TBL_ARRAY('01')       │
│ 00000000000000000004 │HR.TBL_ARRAY('01')            │                          │
└──────────────────────┴──────────────────────────────┴──────────────────────────┘

PostgreSQL 中的等效项:

WITH prep AS (
  SELECT NR, ARRAY_AGG(GRD) AS grds
  FROM tab
  GROUP BY NR
)
SELECT prep.*, LEAD(grds) OVER(ORDER BY nr) AS lead_grds
FROM prep;

<强> DBFiddle Demo

关于sql - Oracle SQL (PL/SQL) 中带有集合的窗口函数(超前/滞后),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52125500/

相关文章:

mysql - SQL CE 中的条件查询,其中列具有 NULL 值

sql - 使用非缓存数据测试查询速度?

oracle - 授予用户在查询时使用表索引的什么?

oracle - 使用 Oracle PL/SQL For 循环遍历逗号分隔的字符串

java - PL/SQL 数据类型 BINARY_INTEGER 如何具体化为 Java 类型?

MySQL为特定c中的每种类型选择一定数量的行

MySQL 错误的排序顺序 - 忽略第一列

java - Oracle JDBC 欧元字符

python - 数据库重启时 cx_oracle 连接丢失

sql - 正则表达式 PL/SQL