oracle 基于列值溢出的动态间隔从表中提取记录

dwbf0jvd  于 2022-12-18  发布在  Oracle
关注(0)|答案(1)|浏览(98)

我有一个表如下
| 身份证|键|地址|
| - ------|- ------|- ------|
| 十一|无|纽约|
| 十二|无|华盛顿|
| 十三|1个|华盛顿|
| 十四|1个|纽约|
| 十五|第二章|华盛顿|
| 十六|三个|华盛顿|
| 十七个|三个|华盛顿|
| 十八|四个| lucene 堡|
我希望根据键提取信息,以便每页的最小记录数为3,如果记录3处的键在接下来的几个记录中仍然存在,则需要考虑后续记录,以便结果集看起来像
第一页
| 身份证|键|地址|
| - ------|- ------|- ------|
| 十一|无|纽约|
| 十二|无|华盛顿|
| 十三|1个|华盛顿|
| 十四|1个|纽约|
第二页
| 身份证|键|地址|
| - ------|- ------|- ------|
| 十五|第二章|华盛顿|
| 十六|三个|华盛顿|
| 十七个|三个|华盛顿|
第三页
| 身份证|键|地址|
| - ------|- ------|- ------|
| 十八|四个| lucene 堡|

ruyhziif

ruyhziif1#

在Oracle 12中,可以使用MATCH_RECOGNIZE进行逐行处理:

SELECT *
FROM   table_name
MATCH_RECOGNIZE(
  ORDER BY id
  MEASURES
    MATCH_NUMBER() AS page
  ALL ROWS PER MATCH
  PATTERN ( any_row{1,3} same_key* )
  DEFINE same_key AS PREV(key) = key
);

其中,对于示例数据:

CREATE TABLE table_name (id, key, address) AS
SELECT 11, 0, 'newYork' FROM DUAL UNION ALL
SELECT 12, 0, 'Washington' FROM DUAL UNION ALL
SELECT 13, 1, 'Washington' FROM DUAL UNION ALL
SELECT 14, 1, 'newYork' FROM DUAL UNION ALL
SELECT 15, 2, 'Washington' FROM DUAL UNION ALL
SELECT 16, 3, 'Washington' FROM DUAL UNION ALL
SELECT 17, 3, 'Washington' FROM DUAL UNION ALL
SELECT 18, 4, 'Luxemberg' FROM DUAL;

输出:
| 识别号|页次|关键词|地址|
| - ------|- ------|- ------|- ------|
| 十一|1个|无|纽约|
| 十二|1个|无|华盛顿|
| 十三|1个|1个|华盛顿|
| 十四|1个|1个|纽约|
| 十五|第二章|第二章|华盛顿|
| 十六|第二章|三个|华盛顿|
| 十七个|第二章|三个|华盛顿|
| 十八|三个|四个| lucene 堡|
如果你只想要某个页面,那么在查询的末尾添加一个WHERE过滤器。
fiddle

相关问题