关于聚合函数的问题
questions on aggregation functions
我正在尝试滚动 up/aggregate 记录,但无法从 oracle 聚合函数中找到解决方案。
我一直在玩 LAG
、COLLECT
、RANK
,但还没有找到解决方案。
我有以下 table 并且需要为最后两个用户操作提取最后 5 个用户评论。
在下面的示例中,最后两个操作是 Action2 和 Action3。
date | user_id | user_action | user_comment
---------+---------+-------------+-------------
5/1/2019 | USER3 | OPEN | COMMENT0
5/1/2019 | USER1 | ACTION1 | COMMENT1
5/2/2019 | USER2 | OPEN | COMMENT2
5/3/2019 | USER2 | ACTION2 | COMMENT3
5/4/2019 | USER3 | OPEN | COMMENT4
5/5/2019 | USER3 | OPEN | COMMENT5
5/5/2019 | USER4 | OPEN | COMMENT6
5/6/2019 | USER3 | OPEN | COMMENT7
5/7/2019 | USER3 | OPEN | COMMENT8
5/8/2019 | USER3 | OPEN | COMMENT9
5/9/2019 | USER3 | ACTION3 | COMMENT10
重点是用户 4 的操作不应包括在内。
不应包含 Comment0,因为它不在 Action2 和 action3 之间,即使它与 Action3 是同一用户。
预期结果:
user_id | action | comments
--------+---------+--------------------------------------------------
USER3 | ACTION3 | COMMENT10//COMMENT9//COMMENT8//COMMENT7//COMMENT5
USER2 | ACTION2 | COMMENT3//COMMENT2
任何人都可以提供任何提示吗?
以下查询可能需要一些调整。但是,它可以为您提供一个寻找解决方案的起点
符合您的要求。 Ideas/steps: {1} 通过 ROW_NUMBER() 为特定用户的所有条目编号。 {2} 查找最后 2 个操作。 {3} 加入 2 个结果集,选择最后 5 个条目,并使用 GROUP BY 和 LISTAGG() 将评论放入一行。
select
UA.userid, UA.useraction
, listagg( R.usercomment, '//' ) within group ( order by R.date_ desc ) --{3}
as comments
from (
select -- {1}
date_, userid, useraction, usercomment
, row_number() over ( partition by userid order by date_ desc ) rownum_
from useractions
) R join ( -- {3}
select userid, useraction -- {2}
from (
select date_, userid, useraction
, row_number() over ( order by date_ desc ) rownum2_
from useractions
where useraction like 'ACTION%'
)
where rownum2_ <= 2
) UA on R.userid = UA.userid -- {3} join
where R.rownum_ between 1 and 5 -- {3} we only the last 5 entries
group by UA.userid, UA.useraction -- {3}
order by userid desc
;
-- result
USERID USERACTION COMMENTS
USER3 ACTION3 COMMENT10//COMMENT9//COMMENT8//COMMENT7//COMMENT5
USER2 ACTION2 COMMENT3//COMMENT2
我正在尝试滚动 up/aggregate 记录,但无法从 oracle 聚合函数中找到解决方案。
我一直在玩 LAG
、COLLECT
、RANK
,但还没有找到解决方案。
我有以下 table 并且需要为最后两个用户操作提取最后 5 个用户评论。
在下面的示例中,最后两个操作是 Action2 和 Action3。
date | user_id | user_action | user_comment
---------+---------+-------------+-------------
5/1/2019 | USER3 | OPEN | COMMENT0
5/1/2019 | USER1 | ACTION1 | COMMENT1
5/2/2019 | USER2 | OPEN | COMMENT2
5/3/2019 | USER2 | ACTION2 | COMMENT3
5/4/2019 | USER3 | OPEN | COMMENT4
5/5/2019 | USER3 | OPEN | COMMENT5
5/5/2019 | USER4 | OPEN | COMMENT6
5/6/2019 | USER3 | OPEN | COMMENT7
5/7/2019 | USER3 | OPEN | COMMENT8
5/8/2019 | USER3 | OPEN | COMMENT9
5/9/2019 | USER3 | ACTION3 | COMMENT10
重点是用户 4 的操作不应包括在内。
不应包含 Comment0,因为它不在 Action2 和 action3 之间,即使它与 Action3 是同一用户。
预期结果:
user_id | action | comments
--------+---------+--------------------------------------------------
USER3 | ACTION3 | COMMENT10//COMMENT9//COMMENT8//COMMENT7//COMMENT5
USER2 | ACTION2 | COMMENT3//COMMENT2
任何人都可以提供任何提示吗?
以下查询可能需要一些调整。但是,它可以为您提供一个寻找解决方案的起点 符合您的要求。 Ideas/steps: {1} 通过 ROW_NUMBER() 为特定用户的所有条目编号。 {2} 查找最后 2 个操作。 {3} 加入 2 个结果集,选择最后 5 个条目,并使用 GROUP BY 和 LISTAGG() 将评论放入一行。
select
UA.userid, UA.useraction
, listagg( R.usercomment, '//' ) within group ( order by R.date_ desc ) --{3}
as comments
from (
select -- {1}
date_, userid, useraction, usercomment
, row_number() over ( partition by userid order by date_ desc ) rownum_
from useractions
) R join ( -- {3}
select userid, useraction -- {2}
from (
select date_, userid, useraction
, row_number() over ( order by date_ desc ) rownum2_
from useractions
where useraction like 'ACTION%'
)
where rownum2_ <= 2
) UA on R.userid = UA.userid -- {3} join
where R.rownum_ between 1 and 5 -- {3} we only the last 5 entries
group by UA.userid, UA.useraction -- {3}
order by userid desc
;
-- result
USERID USERACTION COMMENTS
USER3 ACTION3 COMMENT10//COMMENT9//COMMENT8//COMMENT7//COMMENT5
USER2 ACTION2 COMMENT3//COMMENT2