SELECT key1, key2, JSON_ARRAYAGG(foo) foo, JSON_ARRAYAGG(bar) bar FROM (
select 1 as key1, 2 as key2, '1.0' as foo, 'A' as bar from dual
UNION
select 1, 2, '2.0' , 'A' as bar from dual
UNION
select 3, 4, '2.0' , 'A' as bar from dual
UNION
select 3, 4, '2.0' , 'B' as bar from dual
UNION
select 3, 4, '2.0' , 'B' as bar from dual) z
GROUP BY key1, key2
查询返回以下结果:
我期待着
我觉得JSON_ARRAYagg不支持DISTINCT,有什么建议吗?
4条答案
按热度按时间6vl6ewon1#
您可以使用
COLLECT(DISTINCT ...)
执行聚合,然后将生成的集合转换为JSON:其中,对于样本数据:
输出:
| KEY1| KEY2| FOO| BAR|
| --------------|--------------|--------------|--------------|
| 1| 2| [“1.0”,“2.0”]|[A]|
| 3|四|[“2.0”]|[“A”,“B”]|
fiddle
nc1teljy2#
是的,还没有实施(尚未)。解决方法是提前消除重复数据,例如
s3fp2yjn3#
除了康纳写的替代解决方案可能是
聚合函数+ row_number用于重复数据消除(
rn
可根据具体情况移动到where clause
而不是decode
,但在这种情况下,distinct
更可取)相关标量中的嵌套聚合(请记住,每个相关标量实际上是一个隐式
join
)fquxozlt4#
另一个解决方案,也适用于不支持DISTINCT的旧版本ORACLE上的LISTAGG,使用不考虑NULL值的事实,是使用LAG进行DECODE: