我试图通过listagg()从列表返回第一条记录。我试过使用LIMIT,TOP,PARTITION,但没有什么对我有用。
查询是这样的:
select distinct(col1), col2, LISTAGG(col4, '; ')
WITHIN GROUP (ORDER BY....)
from table1 inner join table 2 on ..
group by ....;
因此,查询是获取满足条件的所有记录。现在,由于我有列表,我只需要为最新的记录提供修复。
希望我清楚自己在做什么。任何帮助表示赞赏。
答案 0 :(得分:1)
为什么要使用listagg()
?使用keep
:
SELECT MAX(COL4) KEEP (DENSE_RANK FIRST col4 ORDER BY . . .)
或者,如果没有GROUP BY
,您只需使用分析函数FIRST_VALUE()
。
答案 1 :(得分:0)
使用SUBSTR
和INSTR
:
SELECT t.*,
SUBSTR(YourColumn, 0, INSTR(YourColumn, ',')-1) as newCol
FROM (Your Query Here) t
仅当col4
不包含逗号时才会这样。
答案 2 :(得分:0)
嗯,第一个案例你不需要LISTAGG
。从LISTAGG的输出中提取效率较低。相反,您可以使用FIRST_VALUE
。对于第二种情况,您可以在顶部使用row_number()
函数和aplply LISTAGG
,如图所示。
选择最新记录
SELECT t.*, FIRST_VALUE(col4) OVER( PARTITION BY id ORDER BY ..) latest
FROM
( select id,col1,..col4 FROM.. ) t;
要选择除LISTAGG
以外的元素,请使用
select id,LISTAGG(col4 ,';') WITHIN GROUP ( ORDER BY .. ) apart_from_latest FROM
(
SELECT t.*, row_number() OVER( PARTITION BY id ORDER BY ..) rn
FROM
( select id,col1,..col4 FROM.. ) t ) WHERE rn > 1 group BY ..;