带有 keep (dense_rank) 的 Oracle 1.2 ListAgg 在列表中给出了额外的逗号
Oracle 1.2 ListAgg with keep (dense_rank) gives extra comma in the list
我正在使用 KEEP (DENSE_RANK LAST)
分析函数来获取组中的最后一个值,并且我正在进一步使用 LISTAGG
函数从以前的结果生成一个列表。奇怪的是在列表的末尾有一个额外的分隔符。有谁知道为什么,或者这是 Oracle 中的错误?
这是一个简化的演示:
with mydata as (
select to_date('4/1/2015','mm/dd/yyyy') next_due, 51528 cust_id from dual
union all select to_date('4/1/2015','mm/dd/yyyy'), 5364 from dual
union all select to_date('4/3/2015','mm/dd/yyyy'), 51468 from dual
), i1 as (
select cust_id,
max(next_due) keep (dense_rank last order by next_due) max_date
from mydata
group by cust_id
)
select max_date,
listagg(cust_id||',') within group (order by 1) maxdate_list
from i1
group by max_date
结果是
MAX_DATE MAXDATE_LIST
---------- ---------------
04/01/2015 51528,5364,
04/03/2015 51468,
注意到每个 MAXDATE_LIST
末尾不需要的逗号了吗?如果我切换到 FIRST_VALUE() OVER (PARTITION...)
也会发生同样的事情
不要自己使用 ||
连接逗号。您需要将其作为参数传递给 listagg
:
listagg(cust_id, ',')
我正在使用 KEEP (DENSE_RANK LAST)
分析函数来获取组中的最后一个值,并且我正在进一步使用 LISTAGG
函数从以前的结果生成一个列表。奇怪的是在列表的末尾有一个额外的分隔符。有谁知道为什么,或者这是 Oracle 中的错误?
这是一个简化的演示:
with mydata as (
select to_date('4/1/2015','mm/dd/yyyy') next_due, 51528 cust_id from dual
union all select to_date('4/1/2015','mm/dd/yyyy'), 5364 from dual
union all select to_date('4/3/2015','mm/dd/yyyy'), 51468 from dual
), i1 as (
select cust_id,
max(next_due) keep (dense_rank last order by next_due) max_date
from mydata
group by cust_id
)
select max_date,
listagg(cust_id||',') within group (order by 1) maxdate_list
from i1
group by max_date
结果是
MAX_DATE MAXDATE_LIST
---------- ---------------
04/01/2015 51528,5364,
04/03/2015 51468,
注意到每个 MAXDATE_LIST
末尾不需要的逗号了吗?如果我切换到 FIRST_VALUE() OVER (PARTITION...)
不要自己使用 ||
连接逗号。您需要将其作为参数传递给 listagg
:
listagg(cust_id, ',')