[英]How can I clean up this report using LISTAGG?
我有一个Oracle表存储按字段细分的MARC21数据:
doc_number | 领域 文本
我已经在SQL Fiddle中创建了一个示例表。 数据本身被大大简化了(对于6条记录,我仅包括相关字段,所有6条记录在实际数据中可能长20-30行)。
我需要基于许多其他参数从该表中提取特定字段,并将其汇总到一行中,并消除这些汇总文本包含关键字或短语的行(“抑制显示”)。 使用SQL Fiddle设置中的查询,我得到了我不需要的行(带有“ Suppress display”的行)一式三份。 如果我使用WHERE子句消除包含文本的特定字段( WHERE field = '902' AND text LIKE 'Suppress'
),那只会缩短聚合文本,并且我只会得到三行而不是三行。
查询:
SELECT doc_number,
LISTAGG(field || '=' || text, '; ') WITHIN GROUP (ORDER BY field) OVER (PARTITION BY doc_number)
FROM record
因此,A:如何消除LISTAGG一式三份列出的行? B:如何(如果可能)基于聚合文本来限制查询?
如果我对您的理解正确,则可以从查询中进行选择,并按两列进行分组: 更新了SQL Fiddle
select
*
from
(
SELECT doc_number, LISTAGG(field || '=' || text, '; ')
WITHIN GROUP (ORDER BY field) OVER (PARTITION BY doc_number) as Bob
FROM record
) t1
group by
doc_number,
bob
只需删除分区,并加入一个group by
:
SELECT doc_number,
LISTAGG(field || '=' || text, '; ') WITHIN GROUP (ORDER BY field)
FROM record
GROUP BY doc_number
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.