2014-09-30 26 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