如何从Oracle中的listagg获得最高记录?

时间:2017-08-27 07:59:15

标签: sql oracle

我试图通过listagg()从列表返回第一条记录。我试过使用LIMIT,TOP,PARTITION,但没有什么对我有用。

查询是这样的:

select distinct(col1), col2, LISTAGG(col4, '; ')
         WITHIN GROUP (ORDER BY....) 
from table1 inner join table 2 on ..
group by ....;

因此,查询是获取满足条件的所有记录。现在,由于我有列表,我只需要为最新的记录提供修复。

希望我清楚自己在做什么。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

为什么要使用listagg()?使用keep

SELECT MAX(COL4) KEEP (DENSE_RANK FIRST col4 ORDER BY . . .)

或者,如果没有GROUP BY,您只需使用分析函数FIRST_VALUE()

答案 1 :(得分:0)

使用SUBSTRINSTR

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 ..;