在SQL分析

问题描述 投票:0回答:1

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

事件可以采取几个值:安装,登录,购买等。

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

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

我试图自连接表,但我认为这不是最好的解决办法。

请帮帮我。

sql postgresql self-join
1个回答
0
投票

这是你的表的定义(因为我从你的意见,并说明可以理解它):

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的版本现在)

UPDATE

通过版本的所有事件和值

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
© www.soinside.com 2019 - 2024. All rights reserved.