我正在尝试汇总/聚合记录,但是无法从oracle聚合函数中找到解决方案。
我一直在玩LAG
,COLLECT
,RANK
,但是找不到解决方案。
我有下表,需要为最后两个用户操作提取最后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
重点是不应该包含User4的动作。
不应该包含注释0,因为注释0不在Action2和Action3之间,即使它与Action3是同一用户。
user_id | action | comments
--------+---------+--------------------------------------------------
USER3 | ACTION3 | COMMENT10//COMMENT9//COMMENT8//COMMENT7//COMMENT5
USER2 | ACTION2 | COMMENT3//COMMENT2
任何人都可以提供提示吗?
答案 0 :(得分:0)
以下查询可能需要进行一些调整。但是,它可以为您提供寻找解决方案的起点, 符合您的要求。想法/步骤:{1}通过ROW_NUMBER()为特定用户的所有条目编号。 {2}查找最后2个动作。 {3}加入2个结果集,选择最后5个条目,然后使用GROUP BY和LISTAGG()将注释放入一行。
(1000 << 40) | (100 << 20) | (3000)