关于聚合函数的问题
Posted
技术标签:
【中文标题】关于聚合函数的问题【英文标题】:questions on aggregation functions 【发布时间】:2019-05-24 20:18:15 【问题描述】:我正在尝试汇总/聚合记录,但无法从 oracle 聚合函数中找到解决方案。
我一直在玩LAG
、COLLECT
、RANK
,但还没有找到解决方案。
我有下表,需要为最后两个用户操作提取最后 5 个用户 cmets。
从下面的示例中,最后两个动作是 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
重点是不应包含 User4 的操作。
Comment0 不应包含在内,因为它不在 Action2 和 action3 之间,即使它与 Action3 是同一用户。
预期结果:
user_id | action | comments
--------+---------+--------------------------------------------------
USER3 | ACTION3 | COMMENT10//COMMENT9//COMMENT8//COMMENT7//COMMENT5
USER2 | ACTION2 | COMMENT3//COMMENT2
任何人都可以提供任何提示吗?
【问题讨论】:
你的表的主键是什么? 您是否尝试过不使用聚合来选择正确的 cmets? 没有答案?你如何确定订单?你怎么知道在你描述的逻辑中应该首先考虑comment0或comment1——因为两者的日期相同? 【参考方案1】:以下查询可能需要一些调整。但是,它可以为您提供寻找解决方案的起点 符合您的要求。想法/步骤:1 通过 ROW_NUMBER() 为特定用户的所有条目编号。 2 找出最后 2 个动作。 3 加入 2 个结果集,选择最后 5 个条目,然后使用 GROUP BY 和 LISTAGG() 将 cmets 放入一行。
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
DBfiddle
【讨论】:
以上是关于关于聚合函数的问题的主要内容,如果未能解决你的问题,请参考以下文章