首页 > 解决方案 > sql中的分析

问题描述

我有一个具有以下结构的表: use_id (int) - event (str) - time (timestamp) - value (int)

事件可以取多个值:安装、登录、购买等。

我需要在更新应用程序之前获取所有用户记录。例如,我的应用程序发布时刻 - 2019 年 1 月 1 日,但用户可能会在任何一天安装新版本。

我怎样才能得到sum(value)第一个和第二个版本。---------

我尝试了自连接表,但我认为这不是最好的解决方案。

请帮帮我。

标签: sqlpostgresqlself-join

解决方案


这是您的表格的定义(正如我从您的评论和描述中理解的那样):

CREATE TABLE user_events (
   user_id integer,
   event varchar,
  time timestamp without time zone,
  value integer
);

这是您要求的查询:

SELECT
    COUNT(user_id),
    SUM(value)
FROM (
    SELECT 
        DISTINCT ON (user_id)
        user_id,time,value
    FROM user_events
    WHERE event='install'
    ORDER BY user_id, time DESC
) last_installations
WHERE 
    time BETWEEN date '2018-01-01' AND date '2019-01-01';

一些解释:

  • 内部查询 ( last_installations) 为每个用户选择最后安装事件
  • 外部查询仅过滤出第一和第二版本的安装,并计算SUM(value)(如您所问)和COUNT(user_id)(为了清楚起见,我添加了 - 现在有多少用户正在使用 1 和 2 版本)

更新

所有事件的总和值(按版本)

SELECT 
    event,
    CASE 
        WHEN  time BETWEEN date '2018-01-01' AND timestamp '2018-05-30 23:59:59' THEN 1
        WHEN  time BETWEEN date '2018-06-01' AND timestamp '2018-12-31 23:59:59' THEN 2
        WHEN  time > date '2018-01-01'                                           THEN 3
        ELSE 0 -- unknown version 
    END AS version,
    SUM(value)
FROM user_events
GROUP BY 1,2

推荐阅读