关于聚合函数的问题

Posted

技术标签:

【中文标题】关于聚合函数的问题【英文标题】:questions on aggregation functions 【发布时间】:2019-05-24 20:18:15 【问题描述】:

我正在尝试汇总/聚合记录,但无法从 oracle 聚合函数中找到解决方案。

我一直在玩LAGCOLLECTRANK,但还没有找到解决方案。

我有下表,需要为最后两个用户操作提取最后 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

【讨论】:

以上是关于关于聚合函数的问题的主要内容,如果未能解决你的问题,请参考以下文章

数据库查询,关于聚合函数 max()的用法。

MySQL 聚合函数聚合(组合)函数概述

关于聚合函数的练习

是否可以在 MyBatis 中使用聚合函数

07-SQLSERVER聚合函数

求SQL的聚合函数的定义,特点,注意事项等