Sql Oracle-唯一Listagg值
我不熟悉使用Listag。下面的脚本在这方面起作用,它为我提供了一个值列表,但该列表重复了这些值 是否可以使用Listagg仅返回唯一的值列表 我正在使用oracle 10gSql Oracle-唯一Listagg值,sql,oracle,oracle10g,listagg,Sql,Oracle,Oracle10g,Listagg,我不熟悉使用Listag。下面的脚本在这方面起作用,它为我提供了一个值列表,但该列表重复了这些值 是否可以使用Listagg仅返回唯一的值列表 我正在使用oracle 10g select distinct ds.catnr,ds.planqty, ds.ordnr, ds.posnr, ds.segnr, listagg(case when not li.paco is null then (select unique max(li1.paco) from leos_item li1 whe
select distinct ds.catnr,ds.planqty, ds.ordnr, ds.posnr, ds.segnr,
listagg(case when not li.paco is null then (select unique max(li1.paco) from leos_item li1 where li.av_part_no = li1.av_part_no) end, ', ') within group (order by pd.part_no) inq_no
from oes_delsegview ds, oes_address ad, oes_opos op, oes_nrbom nr, scm_prodtyp sp, leos_item li, part_description pd
where ds.delnr = ad.key
and ad.adr = ds.deladr
and ds.pos_o_status not in ('9', 'D')
and ds.pos_c_status not in ('9', 'D')
and ds.seg_o_status not in ('9', 'D')
and ds.seg_c_status not in ('9', 'D')
and ds.cunr in ('W31170','W31172')
and ds.pos_type != 'RC'
and ds.ordnr = op.ordnr
and ds.posnr = op.posnr
and ds.catnr = pd.catnr
and ds.prodtyp = pd.prodtyp
and ds.packtyp = pd.packtyp
and ds.catnr = nr.p_catnr (+)
and ds.prodtyp = nr.p_prodtyp (+)
and ds.packtyp = nr.p_packtyp (+)
and nr.c_prodtyp = sp.prodtyp (+)
and sp.prodgrp (+) = 'COMP'
and substr(nr.c_prodtyp,1,2) not in ('MT','LF')
and nr.c_catnr = li.catnr (+)
and nr.c_prodtyp = li.prodtyp (+)
and nr.c_packtyp = li.packtyp (+)
and pd.catnr = '9780007938797'
group by ds.catnr,ds.planqty, ds.ordnr, ds.posnr, ds.segnr
我的列表的结果是:
14/061127-12, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16, 14/061127-16
我想看到的是:
14/061127-12, 14/061127-16
任何帮助都将不胜感激。我删除了第一个
不同的,因为您的选择查询中的分组依据
所有字段,并用选择
查询替换了时的大小写:
select ds.catnr,ds.planqty, ds.ordnr, ds.posnr, ds.segnr,
listagg((select distinct max(li1.paco) from leos_item li1 where li.av_part_no = li1.av_part_no and li.paco is not null), ', ') within group (order by pd.part_no) inq_no
from oes_delsegview ds, oes_address ad, oes_opos op, oes_nrbom nr, scm_prodtyp sp, leos_item li, part_description pd
where ds.delnr = ad.key
and ad.adr = ds.deladr
and ds.pos_o_status not in ('9', 'D')
and ds.pos_c_status not in ('9', 'D')
and ds.seg_o_status not in ('9', 'D')
and ds.seg_c_status not in ('9', 'D')
and ds.cunr in ('W31170','W31172')
and ds.pos_type != 'RC'
and ds.ordnr = op.ordnr
and ds.posnr = op.posnr
and ds.catnr = pd.catnr
and ds.prodtyp = pd.prodtyp
and ds.packtyp = pd.packtyp
and ds.catnr = nr.p_catnr (+)
and ds.prodtyp = nr.p_prodtyp (+)
and ds.packtyp = nr.p_packtyp (+)
and nr.c_prodtyp = sp.prodtyp (+)
and sp.prodgrp (+) = 'COMP'
and substr(nr.c_prodtyp,1,2) not in ('MT','LF')
and nr.c_catnr = li.catnr (+)
and nr.c_prodtyp = li.prodtyp (+)
and nr.c_packtyp = li.packtyp (+)
and pd.catnr = '9780007938797'
group by ds.catnr,ds.planqty, ds.ordnr, ds.posnr, ds.segnr
我使用了一个regexp_replace函数来删除listagg中的重复项
regexp_replace(
listagg((select distinct max(li1.paco) from leos_item li1 where li.av_part_no = li1.av_part_no and li.paco is not null), ', ') within group (order by pd.part_no)
,'([^,]+)(,\1)+', '\1') inq_no
看起来工作正常
您可以通过正则表达式替换来完成。以下是一个例子:
-- Citations Per Year - Cited Publications main query. Includes list of unique associated core project numbers, ordered by core project number.
SELECT ptc.pmid AS pmid, ptc.pmc_id, ptc.pub_title AS pubtitle, ptc.author_list AS authorlist,
ptc.pub_date AS pubdate,
REGEXP_REPLACE( LISTAGG ( ppcc.admin_phs_org_code ||
TO_CHAR(ppcc.serial_num,'FM000000'), ',') WITHIN GROUP (ORDER BY ppcc.admin_phs_org_code ||
TO_CHAR(ppcc.serial_num,'FM000000')),
'(^|,)(.+)(,\2)+', '\1\2')
AS projectNum
FROM publication_total_citations ptc
JOIN proj_paper_citation_counts ppcc
ON ptc.pmid = ppcc.pmid
AND ppcc.citation_year = 2013
JOIN user_appls ua
ON ppcc.admin_phs_org_code = ua.admin_phs_org_code
AND ppcc.serial_num = ua.serial_num
AND ua.login_id = 'EVANSF'
GROUP BY ptc.pmid, ptc.pmc_id, ptc.pub_title, ptc.author_list, ptc.pub_date
ORDER BY pmid;
超级简单的答案解决了
select
regexp_replace('14/061127-12, 14/061127-16, 14/061127-16','([^,]+)(,\1)*(,|$)', '\1\3')
from dual
->
14/061127-12,14/061127-16
查看我的完整答案Hi haytem,谢谢,但是我仍然有相同的结果(重复值列表)。这个正则表达式替换有一个bug。尝试查看,搜索:替换为“查看搜索”。我将把固定的一个作为单独的答案发布。除非首先对字符串进行排序,否则的可能重复项不起作用。或者更确切地说,为了让这个正则表达式工作,列表中的所有副本必须彼此相邻。请参阅上面链接中的完整答案