2014-09-30 87 views
0

我有一个存储MARC21数据按字段分解的Oracle表:如何使用LISTAGG清理此报告?

doc_number |字段|文字

我在SQL Fiddle创建了一个示例表。数据本身被大大简化(为6条,我只包括相关领域,所有这6都可能20-30行长在实际的数据)。

我需要从基于其他一些参数的这个表,汇总到一个行提取的特定字段,并消除这个地方聚集文本包含一个关键的词或短语行(“抑制显示”)。使用在SQL小提琴设置的查询,我得到我不想行一式三份(以“抑制显示”的那些)。如果我使用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 

所以答:我该如何消除与LISTAGG一式三份上市行?和B:我可以如何(如果可能)限制基于汇总文本的查询?

回答

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 
+0

这工作。我不知道为什么我没有考虑父查询。我也可以在父查询中轻松使用WHERE。谢谢! – 2014-09-30 16:01:16

1

只需删除该分区,包括group by

SELECT doc_number, 
     LISTAGG(field || '=' || text, '; ') WITHIN GROUP (ORDER BY field) 
FROM  record 
GROUP BY doc_number 

http://sqlfiddle.com/#!4/84488/9/0

+0

这可以很好地消除重复。然后,我可以根据文本限制它,还是像Andrew的答案那样还需要父查询? – 2014-09-30 16:04:16