我有一个存储MARC21数据的Oracle表,按字段划分:
doc_number |领域|文本
我在SQL Fiddle中创建了一个示例表。数据本身大大简化了(对于6条记录,我只包括相关字段,其中所有6条在实际数据中可能只有20-30行)。
我需要根据许多其他参数从此表中提取特定字段,汇总到一行,并消除此聚合文本包含关键字或短语的行("抑制显示") 。使用SQL Fiddle设置中的查询,我得到了我不想要的行(带有"抑制显示"的行)一式三份。如果我使用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:如何(如果可能)我可以根据汇总文本限制查询?
答案 0 :(得分:1)
如果我理解正确,您只需从两个列中选择查询和分组: Updated 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
答案 1 :(得分:1)
只需删除分区并添加group by
:
SELECT doc_number,
LISTAGG(field || '=' || text, '; ') WITHIN GROUP (ORDER BY field)
FROM record
GROUP BY doc_number