sql—查找个人最近发生的事件

gzszwxb4  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(237)

我为另一个关于在数组中查找最近日期的问题道歉。
不幸的是,我没有任何运气找到任何其他职位,满足我的特殊需要。
列1是用户ID
第2列是发生的操作类型,并且
第3列是操作发生的日期时间戳
我的目标是按用户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”必须出现在groupby子句中,或者在聚合函数中使用
当我将“source”包含到group by中并选择like时:

```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工具

gcuhipw9

gcuhipw91#

您只需要聚合:

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;

请注意,我已删除 source 从两个 select 以及 group by .

bzzcjhmw

bzzcjhmw2#

假设您正在运行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

相关问题