我正在使用聚合函数 LISTAGG() 将多个匹配项放入单个单元格中,用逗号分隔。问题是,在某些行上,我得到了重复的值,例如
Permit # Inspection
B2023001 Air, Air, Air, Water
B2023002 Gas, Air, Gas
B2023003 Water, Water, Water
Permit # Inspection
B2023001 Air, Water
B2023002 Gas, Air
B2023003 Water
SELECT
B1PERMIT.B1_ALT_ID AS "Permit #",
LISTAGG( G6ACTION.G6_ACT_TYP, ', ' ) WITHIN GROUP ( ORDER BY G6ACTION.G6_ACT_TYP ) AS "Inspection"
FROM
B1PERMIT B1PERMIT
INNER JOIN GPROCESS_HISTORY GPROCESS_HISTORY
ON B1PERMIT.B1_PER_ID1 = GPROCESS_HISTORY.B1_PER_ID1
AND B1PERMIT.B1_PER_ID3 = GPROCESS_HISTORY.B1_PER_ID3
INNER JOIN G6ACTION G6ACTION
ON B1PERMIT.B1_PER_ID1 = G6ACTION.B1_PER_ID1
AND B1PERMIT.B1_PER_ID3 = G6ACTION.B1_PER_ID3
AND ( G6ACTION.G6_ACT_TYP LIKE '%Final%' AND G6ACTION.G6_STATUS = 'Approved' )
GROUP BY B1PERMIT.B1_ALT_ID
ORDER BY B1PERMIT.B1_ALT_ID DESC
我尝试使用 DISTINCT 但这不起作用,因为我的 Oracle 版本太旧 (12.1):
LISTAGG( DISTINCT G6ACTION.G6_ACT_TYP, ', ' ) WITHIN GROUP ( ORDER BY G6ACTION.G6_ACT_TYP ) AS "Inspection"
除了在 LISTAGG() 中使用 DISTINCT,我还有什么其他选择?
您可以简单地在您的组密钥和 G6_ACT_TYPE 上获得一个 DISTINCT,并在外部查询块中执行 LISTAGG:
SELECT B1_ALT_ID AS "Permit #",
LISTAGG( G6_ACT_TYP, ', ' ) WITHIN GROUP ( ORDER BY G6_ACT_TYP ) AS "Inspection"
FROM (SELECT DISTINCT
B1PERMIT.B1_ALT_ID,
G6_ACT_TYP
FROM
B1PERMIT B1PERMIT
INNER JOIN GPROCESS_HISTORY GPROCESS_HISTORY
ON B1PERMIT.B1_PER_ID1 = GPROCESS_HISTORY.B1_PER_ID1
AND B1PERMIT.B1_PER_ID3 = GPROCESS_HISTORY.B1_PER_ID3
INNER JOIN G6ACTION G6ACTION
ON B1PERMIT.B1_PER_ID1 = G6ACTION.B1_PER_ID1
AND B1PERMIT.B1_PER_ID3 = G6ACTION.B1_PER_ID3
AND ( G6ACTION.G6_ACT_TYP LIKE '%Final%' AND G6ACTION.G6_STATUS = 'Approved' ))
GROUP BY B1_ALT_ID
ORDER BY B1_ALT_ID DESC