【问题标题】:Aggregate previous rows in Postgres query聚合 Postgres 查询中的先前行
【发布时间】:2018-03-29 16:12:20
【问题描述】:

我有一个存储应用程序用户活动信息的表。

| username | day |
|----------|-----|
|   u1     |   1 |
|   u1     |   2 |
|   u1     |   3 |
|     u2   |   2 |
|       u3 |   1 |
|       u3 |   4 |

我希望能够获取有关每天唯一用户和最近用户的历史数据。

  • 第 N 天的唯一用户是在第 0 天和第 N 天之间有任何活动的所有不同用户。
  • 第 N 天的最近用户是在第 N-1 天或第 N 天有任何活动的所有不同用户。在实际应用中,这将在第 N-30 天和第 N 天之间。

我能够获取在每个特定日期活跃的用户列表,但我不确定如何汇总这些数据以获取唯一用户或最近用户。

SELECT 
day, 
array_agg(username) as day_users
FROM myTable
GROUP BY day
ORDER BY day;

| day | day_users |
|-----|-----------|
|   1 |  u1,   u3 |
|   2 |  u1,u2    |
|   3 |  u1       |
|   4 |        u3 |

对于上面的示例数据,预期输出将是(不需要间距):

| day | unique_users | recent_users 
|-----|--------------|-------------
|   1 |     u1,   u3 |     u1,   u3
|   2 |     u1,u2,u3 |     u1,u2,u3
|   3 |     u1,u2,u3 |     u1,u2
|   4 |     u1,u2,u3 |     u1,   u3

相关 SQL Fiddle:http://sqlfiddle.com/#!17/b793f/1

【问题讨论】:

  • 提示:使用“滞后”
  • 请始终提供您的 Postgres 版本和显示数据类型和约束的表定义(CREATE TABLE 语句)。

标签: sql postgresql aggregate-functions


【解决方案1】:

您需要一个自定义聚合函数:

create or replace function array_union(anyarray, anyarray)
returns anyarray language sql
as $$
    select 
        array(
            select unnest($1)
            union
            select unnest($2)
            order by unnest
        )
$$;

create aggregate array_union_agg (anyarray)
(
    sfunc = array_union,
    stype = anyarray
);

在基于你的查询中使用聚合作为窗口函数:

select 
    day, 
    day_users, 
    array_union_agg(day_users) over (order by day) as unique_users,
    array_union_agg(day_users) over (order by day rows between 1 preceding and current row) as recent_users
from (
    select day, array_agg(username) as day_users
    from my_table
    group by day
    order by day
    ) s

 day | day_users | unique_users | recent_users 
-----+-----------+--------------+--------------
   1 | {u1,u3}   | {u1,u3}      | {u1,u3}
   2 | {u1,u2}   | {u1,u2,u3}   | {u1,u2,u3}
   3 | {u1}      | {u1,u2,u3}   | {u1,u2}
   4 | {u3}      | {u1,u2,u3}   | {u1,u3}
(4 rows)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-29
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多