查找个人最近发生的事件

Posted

技术标签:

【中文标题】查找个人最近发生的事件【英文标题】:Find most recent occurrence of an event for an individual 【发布时间】:2020-06-25 00:16:50 【问题描述】:

对于另一个关于在数组中查找最近日期的问题,我深表歉意。

很遗憾,我没有找到任何其他满足我特殊需求的帖子。

第 1 列是用户 ID 第 2 列是发生的操作类型,并且 第 3 列是操作发生的日期时间戳

我的目标是按 user_id 分组,并将不同操作类型的最新列作为自己的列。

示例数据:

+---------+--------+------------+
| user_id | source |  created   |
+---------+--------+------------+
|       1 | QT     | 2020-01-01 |
|       2 | QT     | 2020-01-02 |
|       3 | QT     | 2020-01-01 |
|       1 | QT     | 2020-01-03 |
|       2 | QT     | 2020-01-04 |
|       3 | QT     | 2020-01-05 |
|       1 | AT     | 2020-01-02 |
|       2 | AT     | 2020-01-02 |
|       3 | AT     | 2020-01-03 |
+---------+--------+------------+

期望的结果:

+---------+------------+------------+
| user_id |   max QT   |   Max AT   |
+---------+------------+------------+
|       1 | 2020-01-03 | 2020-01-02 |
|       2 | 2020-01-04 | 2020-01-02 |
|       3 | 2020-01-05 | 2020-01-03 |
+---------+------------+------------+

我最初的想法是:

```select
user_id
,case when source = 'QT' THEN max(created) END as "last_QT"
,case when source = 'AT' THEN max(created) END as "last_AT"
from analytics.all_tx_bars_all 
group by user_id```

但这给了我错误: 无效操作:列“source”必须出现在 GROUP BY 子句中或在聚合函数中使用

当我将“来源”包含在分组中并选择如下时:

```select
user_id
,source
,case when source = 'QT' THEN max(created) END as "last_QT"
,case when source = 'AT' THEN max(created) END as "last_AT"
from analytics.all_tx_bars_all 
group by user_id,source```

我得到类似的东西:

+---------+--------+------------+------------+
| user_id | source |   max QT   |   Max AT   |
+---------+--------+------------+------------+
|       1 | QT     | 2020-01-03 |            |
|       2 | QT     | 2020-01-04 |            |
|       3 | QT     | 2020-01-05 |            |
|       1 | AT     |            | 2020-01-02 |
|       2 | AT     |            | 2020-01-02 |
|       3 | AT     |            | 2020-01-03 |
+---------+--------+------------+------------+

为了给我的问题增添一点色彩,我在这里使用元数据库中的 SQL 工具

【问题讨论】:

【参考方案1】:

你只需要聚合:

select user_id,
       max(case when source = 'QT' then created end) as last_QT,
       max(case when source = 'AT' then created end) as last_AT
from analytics.all_tx_bars_all 
group by user_id;

请注意,我已从 selectgroup by 中删除了 source

【讨论】:

【参考方案2】:

假设您正在运行 Postgres,如错误消息所示,您可以按如下方式进行条件聚合:

select 
    user_id,
    max(created) filter(where source = 'QT') max_qt,
    max(created) filter(where source = 'AT') max_at
from analytics.all_tx_bars_all
group by user_id

如果您的数据库不支持filter 语法,那么我们可以使用case 表达式:

select 
    user_id,
    max(case when source = 'QT' then created end) max_qt,
    max(case when source = 'AT' then created end) max_at
from analytics.all_tx_bars_all
group by user_id

【讨论】:

感谢您的快速回复!不幸的是,这给了我以下错误:[Amazon](500310) Invalid operation: syntax error at or near "(" Position: 168; 为了给我的问题增加一点色彩,我在这里使用元数据库中的 SQL 工具 @TobiahAdam:我用不使用filter 语法的解决方案更新了我的答案。

以上是关于查找个人最近发生的事件的主要内容,如果未能解决你的问题,请参考以下文章

查找发生事件的forloop的值Python

如何使用pyspark查找时间范围内每分钟发生的事件

查找时间范围以限制日历中同一时间发生的事件。 (django)

Rails / SQL 查询查找最近的事件

当事件在某一天发生多次时查找详细信息

使用 Spark/Scala 有效地按键分组并查找在特定时间窗口中发生的事件的上一个时间戳